【LeetCode】206.反转链表【双指针】

再发5篇就满100篇了,我就嗯水了蛤~
:- )

1.题目
题目链接:点击这里
2.解决思路
双指针的快慢指针应用,用快指针curr指向下一个结点,慢指针prev指向当前结点(注意反转时要以空指针当成最后一个结点)在每个结点反转next指针之前,先保留下它当前的next指针mid,用mid作为下一个curr(实现curr向后移动)之后再将curr->next=prev实现反转,prev随即变为curr,curr再更新为mid。在纸上画一画图可以比较清楚的观察到过程,本质上只需要注意在反转前保存好原来的next就可以了。

3.代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* reverseList(ListNode* head) {
    
    
        
        ListNode* prev=nullptr;
        ListNode* curr=head;

        while(curr!=nullptr){
    
    
            ListNode* mid=curr->next;//保存next
            curr->next=prev;//反转
            prev=curr;//prev往前移动一个结点
            curr=mid;//curr往前移动一个结点
        }

        return prev;//最后curr会变为nullptr,prev为反转后的head

    }
};

Guess you like

Origin blog.csdn.net/qq_43579980/article/details/120227120