Reverse Linked List II
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.
通过头痛折磨的训练之后,这些题目不用调试,一次性AC。
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 *cur = head;
ListNode dummy(0);
dummy.next = head;
ListNode *pre = &dummy;
for (int i = 1; i < m; i++)
{
pre = cur;
cur = cur->next;
}
ListNode *post;
ListNode *ppost;
if (cur) ppost = cur;
if (ppost) post = ppost->next;
for (int j = m; j <= n; j++)
{
ppost->next = cur;
cur = ppost;
ppost = post;
if (post) post = post->next;
}
pre->next->next = ppost;
pre->next = cur;
return dummy.next;
}
};
上面是逆转法,下面是插入法 2014-1-10更新:
ListNode *reverseBetween(ListNode *head, int m, int n)
{
if (!head || m==n) return head;
ListNode dummy(-1);
dummy.next = head;
ListNode *pre = &dummy;
for (int i = 1; i < m; i++)
{
pre = pre->next;
}
ListNode *insertPre = pre->next;
for (int i = m; i < n; i++)
{
ListNode *cur = insertPre->next;
insertPre->next = cur->next;
cur->next = pre->next;
pre->next = cur;
}
return dummy.next;
}
//2014-2-14 update
ListNode *reverseBetween(ListNode *head, int m, int n)
{
ListNode dummy(0);
ListNode *p = &dummy;
dummy.next = head;
for (int i = 1; i < m; i++) p = p->next;
head = p->next;
for ( ; m < n; m++)
{
ListNode *tmp = head->next;
head->next = tmp->next;
tmp->next = p->next;
p->next = tmp;
}
return dummy.next;
}