题目链接/文章讲解/视频讲解:代码随想录
思路:双指针,temp放当前操作指针cur的下一个指针,pre放cur的上一个指针;先定义pre为NULL,然后cur为head,定循环的停止条件,然后每次循环都是先保存cur->next在temp,让cur->next指向pre,然后先把pre移动到现在的cur,cur移动到temp里存在cur-next。
代码:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 保存cur的下一个节点
ListNode* cur = head;
ListNode* pre = NULL;
while(cur) {
temp = cur->next; // 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur->next = pre; // 翻转操作
// 更新pre 和 cur指针
pre = cur;
cur = temp;
}
return pre;
}
};
错误原因:
1.要注意while的判断条件是当前操作指针指向了空节点也就是尾结点的后面,这个时候才不需要把当前节点的next转向pre。
2.先移动pre再移动cur;
递归的思路去做的话,就是把pre和cur的初始化转为实参赋给函数形参的过程;
然后调用的函数去移动pre和cur
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 和双指针法初始化是一样的逻辑
// ListNode* cur = head;
// ListNode* pre = NULL;
return reverse(NULL, head);
}
ListNode* reverse(ListNode* pre,ListNode* cur){
//判断是否进行翻转,如果是cur已经指向尾结点的下一个节点,那就不需要翻转了。
if(cur == NULL) return pre;
ListNode* temp = cur->next;//先存下cur->next到temp里
cur->next = pre;//把cur->next指向pre;
// 可以和双指针法的代码进行对比,如下递归的写法,其实就是移动了pre和cur
// pre = cur;
// cur = temp;
return reverse(cur,temp);
}
};