题目描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
这题跟反转链表|类似,需要确定反转段的开始节点以及反转段的最后节点,进行反转操作,这里需要注意是需要将反转段前一节点以及反转段最后一个节点都置空,换句话需要将反转段独立出来。
/**
* 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) {
ListNode* pHead=new ListNode(-1);
pHead->next=head;
ListNode* p1=pHead,*p2=pHead;
while(m--!=1)
p1=p1->next;//p1指向需要旋转区间的前一个节点
while(n--!=0)
p2=p2->next;//p2指向旋转区间的最后一个节点
ListNode* last=p2->next;//记录p2的下一个节点
p2->next=NULL;//p2指向置空
ListNode* begin=p1->next; //begin为反转段第一个节点
p1->next=NULL; //p1指向置空
ListNode* first=begin;//这里将反转段首节点记录,后面需要连接反转段尾节点的下一个节点。
//反转操作
ListNode* cur=begin->next;
while(cur)
{
ListNode* tmp=cur->next;
cur->next=begin;
begin=cur;
cur=tmp;
}
//将反转后的部分连接到原链表中
p1->next=p2;
first->next=last;
return pHead->next;
}
};