首先,把oj题目的链接放在这,大家可以先去练习一下,再来看解析。
反转链表——力扣
题目:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
现在让我们来看一下解决代码,先看一下我写的代码。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* tmp = NULL;//一个新的链表,来存储翻转时的链表。
struct ListNode* newhead = head;//一般我们都会创建一个新的指针来指向链表。
while(newhead)
{
struct ListNode* nexthead = newhead->next;//让nexthead指向下一个节点。
newhead->next = tmp;//让下一个节点等于tmp,第一次相当于将第一个节点的next=NULL,第二次以后就相当于将newhead->next链接到翻转后的链表,然后依次链接。
tmp = newhead;//让tmp来接收翻转后的链表
newhead = nexthead;//再让newhead进行下一个节点的翻转。
}
return tmp;
}
这是一种依次翻转,然后链接的方法。
其空间复杂度是:O(1);
时间复杂度是:O(N)。
现在让我们来看一下它的详细讲解,其实我在代码旁边的注释已经十分清楚了,但是让我们来看一下图,可以更清晰的理解它。
首先:第一次翻转
这个时候tmp的具体指向就是:1-NULL。
然后,就是不断的翻转,存储,最后返回。
后面就是不断的重复这个过程。
当然它还有其他的方法,具体的可以看力扣或者其他的讲解,我这边就放一下代码。
struct ListNode* reverseList(struct ListNode* head) { if (head == NULL || head->next == NULL) { return head; } struct ListNode* newHead = reverseList(head->next); head->next->next = head; head->next = NULL; return newHead; } 作者:LeetCode-Solution 链接:https://leetcode.cn/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/ 来源:力扣(LeetCode)