LeetCode:92. 反转链表 II(C++带详细注释)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(head==nullptr||head->next==nullptr||m==n) return head;//三种情况直接返回
ListNode*pre=nullptr,*cur=head;//上一个指向和当前指向
while(m>1)//将cur移到第m个元素,pre指向前一个
{
pre=cur;//pre后移
cur=cur->next;//cur后移
m--;//m,n减一
n--;
}
ListNode*tail=cur,*con=pre;//m-n逆置后头尾元素,此时tail指向第m个,con指向前一个
ListNode*third;//辅助指针
while(n>0)//将m-n的元素逆置,结束后pre指向第n个元素,cur指向后一个
{
third=cur->next;//暂存下一步指针
cur->next=pre;//把当前元素指针逆置
pre=cur;//pre后移
cur=third; //cur后移
n--;
}
if(con)//con非空,m不是从0开始
{
con->next=pre;//m前一个元素的next指针不指向第m个,指向第n个元素
}
else//m==0从零开始
{
head=pre;//头指针直接指向第n个元素
}
tail->next=cur;//第m个元素的next指针指向第n个元素后一个
return head;//返回结果
}
};