思路
首先我们想要的效果图如下
首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下
因为接下来要要处理该节点,也就是改变 cur->next 的指向了,将cur->next 指向pre ,然后cur要移动到下一位置继续处理节点
再接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。此时我们return pre指针就可以了,pre指针就指向了新的头结点
双指针法
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur=head;
ListNode* pre=nullptr;
ListNode* temp=nullptr;
while(cur){
//1-保存一下 cur的下一个节点,因为接下来要改变cur->next
temp=cur->next;
//2- 翻转操作
cur->next=pre;
//3-更新pre 和 cur指针
pre=cur;
cur=temp;
}
return pre;
}
};
递归法
class Solution {
public:
ListNode* reversal(ListNode* pre,ListNode* cur){
if(cur==nullptr) return pre;
ListNode* temp=cur->next;
cur->next=pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是做了这两步
return reversal(cur,temp);
}
ListNode* reverseList(ListNode* head) {
return reversal(nullptr,head);
}
};