Description:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
Note:
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Solution:
Analysis and Thinking:
题目不是将整个链表进行反转,而是把下标范围为[m,n]的节点进行反转,因此需要把整个链表分成三段,分别是待反转左段,待反转段,待反转右段。算法的重点在于处理带反转段的反转操作以及将三段进行反转后连接。
Steps:
1.从链表头结点开始,遍历直到待反转段的起始位置,并用变量记录待反转起始点的前一个节点位置
2.从m到n开始,不断重复进行如下步骤:当前节点的next指针指向前一节点(这里用a->next以及PrePoint记录),再把前一节点PrePoint更新为当前节点,当前节点更新为其next指针指向的节点(即a=a->next),遍历完成后,完成反转
3.将链表的3个子段进行连接,主义,需要判断初始点是否为head头结点的位置以及结束点是否为尾节点的位置。
Codes:
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n)
{
if(head==NULL)
return NULL;
ListNode *a=head;
ListNode *b=NULL;
for(int i=0;i<m-1;i++) //对第一分段进行处理
{
b=a;
a=a->next;
}
ListNode *endPoint=a;
ListNode *PrePoint=a;
for(int i=m+1;i<=n;i++)
{
ListNode *NextPoint=a->next;
a->next=PrePoint;
PrePoint=a;
a=NextPoint;
}
endPoint->next=a;
if(b)
b->next=PrePoint;
else
head=PrePoint;
return head;
}
};
Results: