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.

用了栈。注意指针移动时不同指针的分工。

/**
 * 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 *guard = new ListNode(0);
        guard -> next =head;
        ListNode *pre = guard;
        ListNode *temp = head;

        ListNode *re ;
        stack<ListNode*> sk;
        
        
        for(int i =1 ; i < m ;i++)
        {
            pre = pre->next;
            temp = pre ->next;
        }
        ListNode *tail = temp;
        temp =temp->next;
        for(int i = m ; i < n ; i++)
        {
            sk.push(temp);
            temp =temp->next;
        }
        while(!sk.empty())
        {
            ListNode* tt =sk.top();
            pre->next = tt;
            pre =pre->next;
            sk.pop();
        }
        pre->next = tail;
        tail->next =temp;
        return guard->next;
    }
};

  

posted on 2014-03-17 15:39  pengyu2003  阅读(118)  评论(0编辑  收藏  举报

导航