题目:反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
思路:拿到这道题我的想法是新创建一个新链表头节点,把在[m,n]区间的节点头插进新链表,在[m,n]区间之外的节点尾插进新链表,但是做这道题废了我好长时间,因为细节还是没能把握好,就比如:输入: 1->2->3->NULL, m = 2, n = 3,这个情况我没考虑到,老是提示错误,但是我有看不出来,没办法,只能调试了,经过调试才发现那里错了。因为头插之后,要把指针tail移到m-n+1个节点之后的节点位置,这个例子移动完刚好是1->3->2->2->2->…这样一个链表,必须的吧tail->next置空,才能得到正确节点1->3->2->NULL!!!
下面是我的代码:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n)
{
if(head == nullptr)
return head;
ListNode* newhead=new ListNode(0);
ListNode* tail=newhead;
int count=1;
while(head)
{
if(count>=m && count<=n )
{
ListNode* head_next=head->next;
head->next=tail->next;
tail->next=head;
head=head_next;
if(count==n)
{
int k=n-m+1;
while(k--)
tail=tail->next;
tail->next=nullptr; //这里是错误点
}
}
else
{
tail->next=head;
tail=head;
head=head->next;
}
count++;
}
return newhead->next;
}
};