
这道题今天已经是第三次刷了,思路都知道但是代码就是写不对,我真的要红温了🤯🤯
以后这道题就统一用双指针法来做吧。
双指针,顾名思义,就是用两个指针来保存一些必要的变量,对于一段链表,我们要将其反转,我们必须知道这段链表的前置节点,当前遍历到的节点和当前节点的下一节点,我们分别用pre
,current
和temp
来表示,如图所示
从上面到下面经历了一次反转,可以看到,在一次反转中,我们仅将current
指向了原本的前置节点pre
,然后将pre
,current
和temp
的位置整体后移一位,然后周而复始,我们通过一个while
循环来实现这样的处理流程,直到head == nullptr
退出循环,此时pre
指向原链表的最后一个元素,此时pre
节点也是反转后的链表的首元素,因此我们直接返回pre
指针即可。
cpp
/**
* 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* pre = nullptr;
ListNode* temp;
while(head){
temp = head -> next; //先保存head的下一个节点
head -> next = pre; //将head指向原链表的前置节点
pre = head;
head = temp;
}
return pre;
}
};