力扣反转列表(206)
提示:(采用双指针法进行链表的反转,无虚拟头结点)记录第一次反转列表出现的错误:
1、问题描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。`
使用一个慢指针记录当前结点的前一个结点,再使用一个临时指针记录当前结点的下一个结点
错误写法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *slow = nullptr;
//cur为快指针
ListNode *cur = head;
ListNode * temp;
while(cur)
{
temp = cur;
cur->next = slow;
slow= cur;
cur= temp->next;
}
return slow;
}
}
2.原因分析:
在while循环的第1句中,我把快指针(cur)赋值给了temp。
第2句使当前结点的指针域指向了其前一个结点(slow)
第3句完成了slow指针的移动
第4句目的是让当前结点变为下一个结点,但是因为我在第二句中改变了cur->next,也就是说此时的当前的temp->next = cur-next->next;
因此应在第1句中直接记录cur->next
3、解决方案:
提示:
循环的第1句中直接记录temp = cur->next
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode * temp;
ListNode * fast=head;
ListNode * slow=NULL;
while(fast)
{
temp = fast->next;
fast->next = slow;
slow = fast;
fast = temp;
}
head = slow;
return head;
}
};
4、提示
用于记录自己的练习过程,仅供参考