Bootstrap

LeetCode 206. 反转链表

目录

1.原题链接:

2.双指针:

代码实现: 

3.头插:

代码实现:

4.递归:

从左往右递归:

代码实现:

从右往左递归:

代码实现:

5.提交结果:

6.读书分享:


1.原题链接:

206. 反转链表

2.双指针:

我们可以用两个指针,一个指向第一个结点,一个指向第二个结点,然后让后一个结点指向前一个节点就好了,但是如果只使用两个指针会存在一个问题:当让后一个结点指向前一个结点的时候,后面的结点会找不到。所以这里需要三个指针方便后续操作。并且最开始要让最左边指针指向NULL,因为反转后的链表最后一个结点后面也会指向NULL。

代码实现: 

struct ListNode* reverseList(struct ListNode* head) {
    typedef struct ListNode ListNode;//重命名
    ListNode* left = NULL;
	ListNode* mid = head;
    ListNode* right;//防止找不到后面的结点
	while (mid!=NULL)
	{
		right = mid->next;
		mid->next = left;
		left = mid;
		mid = right;
        // right=right->next;//如果这样写会存在对空指针的访问
	}
	return left;
}

3.头插:

代码实现:

struct ListNode* reverseList(struct ListNode* head) {
    typedef struct ListNode ListNode; 
    ListNode* cur=head;
    ListNode* newHead=NULL;
    while(cur!=NULL)
    {
        ListNode* next=cur->next;//放在里面不会引起访问空指针的问题
        cur->next=newHead;
        newHead=cur;
        cur=next;
    }
    return newHead;
}

4.递归:

从左往右递归:

此方法跟三个指针的方法相似,应该会稍微好理解些。

开始进入递归函数:

 完成第一次反转:

  递归反转:

代码实现:

struct ListNode* reverse(struct ListNode* pre,struct ListNode* cur)
{
    if(cur==NULL)//递归出口
        return pre;
    struct ListNode* late=cur->next;
    cur->next=pre;
    return reverse(cur,late);
}
struct ListNode* reverseList(struct ListNode* head){
    return reverse(NULL,head);
}

从右往左递归:

先递归到最后一个结点后,回来时再反转。

代码实现:

struct ListNode* reverseList(struct ListNode* head){
    typedef struct ListNode ListNode;
    if(head==NULL||head->next==NULL)//递归结束条件
            return head;
        ListNode* newHead=reverseList(head->next);//开始进入
        head->next->next=head;
        head->next=NULL;
        return newHead;
}

5.提交结果:

6.读书分享:

道德经·第三十七章》:

不欲以静,天下将自定。

解释:不起贪欲而趋于平静,天下便自然复归于安定。

;