题目: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个,标记为f,f的下一个标记为t,f指向f 的next的next,s指向t,t 指向f.这是第一次,
然后呢,f 还是指向f 的next的next,slow 指向刚刚f 的next,也就是被标记的t ,如此一来,便完成循环。
代码:
/**
* 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 *dummy=new ListNode(0);
dummy->next = head;
ListNode *slow = dummy;
n -= m;
while (--m)
slow = slow->next;
ListNode *fast = slow->next, *tmp;
while (n--) {
tmp = fast->next;
fast->next = fast->next->next;
tmp->next = slow->next;
slow->next = tmp;
}
return dummy->next;*/
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *slow=dummy;
n=n-m;//这一句话不能够放在下面循环的后面,因为m变了。
while(--m){
slow=slow->next;//在m个之前的一个
}
ListNode *fast=slow->next,*tmp;
while(n--){
tmp=fast->next;
fast->next=fast->next->next;
tmp->next= slow->next;
slow->next=tmp;
//fast=slow->next;
}
return dummy->next;
}
};