LeetCode92——Reverse Linked List II
时间原因直接跳过一眼看去就很难的91题。。。
言归正传,链表逆置的变形,数据结构上学得是全局逆置,这里是局部逆置。
原题
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
代码分析
因为知道全局链表逆置,这里加了m和n,限制了逆置范围,就需要做一些修改,我的办法很粗暴:
直接把m和n所表示范围的那段链表抠出来,对这段链表进行逆置,当然,抠之前要“保护现场”要记住抠出来部分的头结点的前一个位置,后尾节点的后一个位置,这样逆置后才能与原链表拼接嘛,这个过程有点类似于中断。
至于逆置算法,这个就比较简单了。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m == 0 || n == 0)
{
return head;
}
//创建头结点
ListNode*p = new ListNode(0);
p->next = head;
head = p;
p = p->next;
//把需要逆置的部分“抠”出来
//并记录原链表的入口和出口
ListNode*enter = head;//原链表的入口
ListNode*exit = p;//原链表的出口
ListNode*last = NULL;//逆置部分的最后一个节点
ListNode*first = p;//逆置部分的头结点
int i = 0;
while (i++ < n)
{
if (i < m)
{
enter = enter->next;
first = first->next;
}
if (i == n)
{
last = exit;
}
exit = exit->next;
}
enter->next = NULL;
last->next = NULL;
//完成逆置
ListNode*pPre = first;
ListNode*pCur = pPre->next;
ListNode*pNext = NULL;
while (pCur != NULL)
{
pNext = pCur->next;
pCur->next = pPre;
pPre = pCur;
pCur = pNext;
}
//将原链表与逆置部分组装
first->next = exit;
first = pPre;
enter->next = first;
return head->next;
}
};