[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;

    }

};

  

你可能感兴趣的:(LeetCode)