题目
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.
标签
Linked List
难度
中等
分析
题目意思是将链表中m到n位置的节点逆序。我的做法是用两个指针记录m之前的位置和m的位置,然后将m和n之间的节点进行逆序操作,最后再将节点链接起来。
C代码实现
struct ListNode* reverseBetween(struct ListNode* head, int m, int n)
{
struct ListNode *p, *q, *t;
struct ListNode *h1, *h2; // h1 : remember the pointer before m'th; h2 : remember the m'th pointer
int count = 1;
if(!head)
return NULL;
p = head;
h1 = p;
while(p && count<m)
{
h1 = p;
p = p->next;
count++;
}
if(!p)
return head;
else
q = p->next;
h2 = p;
while(q && count<n)
{
t = q->next;
q->next = p;
p = q;
q = t;
count++;
}
if(h1 == h2) // if m=1
{
h1->next = q;
head = p;
}
else
{
h1->next = p;
h2->next = q;
}
return head;
}