[LeetCode]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.

/**
 * 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 *p=head;
        ListNode *newhead=NULL,*first,*cur=NULL,*last;
        int count=1;
        if(m==1) //翻转头结点
        {
            newhead=first=p;
            while(p)
            {
                if(count==n) return newhead;
                p=p->next;count++;
                first->next=p->next;
                p->next=newhead;
                newhead=p;
                p=first;
            }
        }
        else
        {
            newhead=head;
            while(p)
            {
                if(count+1==m) 
				{
					cur=p;
					first=cur->next;
				}
                p=p->next;count++;
                if(cur&&count<=n)
                {
					last=cur->next;
					if(p!=first)
					{
						cur->next=p;
						first->next=p->next;
						p->next=last;
						p=first;
					}
                }
            }
			return newhead;
        }
		return newhead;
    }
};

  

原文地址:https://www.cnblogs.com/Rosanna/p/3522353.html