【Leetcode】反转单链表

反转单链表

  • 反转单链表题目
  • 题目思路
  • 代码

反转单链表题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
【Leetcode】反转单链表_第1张图片
【Leetcode】反转单链表_第2张图片

题目思路

【Leetcode】反转单链表_第3张图片
链表的本质就是改变每一个结点的next域。
我们从第一个结点开始遍历,改变它的next域。
当我们要注意在改变当前结点的next域之前,我们需要靠next值找到其后的一个结点,并保存起来。
【Leetcode】反转单链表_第4张图片
然后我们进行更新指针。
【Leetcode】反转单链表_第5张图片
(我们更新指针只是更新cur和pre,而不专门对tmp进行更新,原因是循环遍历时我们让cur指针进行遍历的,即cur作为循环条件,而tmp作为cur的后驱结点,值会更先为NULL,当cur指向NULL时,再以tmp=cur->next更新tmp,这时候就是对空指针的非法访问了。所以我们更新的话只是对cur和pre。)
循环的条件为cur不为空指针。这是执行循环体的最后一次。更新cur和pre,然后cur指向空指针,pre为当前cur的值。
再次进入循环体,cur为NULL,不满足循环条件而退出循环。

【Leetcode】反转单链表_第6张图片

代码

 struct ListNode {
     int val;
     struct ListNode *next;
 };

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* cur=head;
    struct ListNode* pre=NULL;
    struct ListNode* tmp;
    while(cur)
    {
        tmp=cur->next;//记录后一个结点
        cur->next=pre;//改变next域
        //更新
        pre=cur;
        cur=tmp;
    }
    return pre;
}

你可能感兴趣的:(Leetcode,leetcode,算法,职场和发展)