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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn 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;
    }
};


原文地址:https://www.cnblogs.com/jsrgfjz/p/8519856.html