Leetcode: 92. Reverse Linked List II

Description

Reverse a linked list from position m to n. Do it in-place and in one-pass.

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的位置,记录它的前一个pre,然后在[m,n]之间逆转链表,记录逆转后的链表尾tail,和链表头cur。最后把逆转后的链表接到原链表合适位置

代码

/**
 * 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 *pre = NULL, *ptr = head;
        ListNode *res = NULL;
        ListNode *cur = NULL, *tail = NULL;
        ListNode *tmp = NULL;
        
        int k = 1;
        while(k < m){
            pre = ptr;
            if(res == NULL)
                res = pre;
            ptr = ptr->next;
            k++;
        }
        
        while(k <= n){
            tmp = ptr->next;
            if(cur == NULL){
                cur = ptr;
                tail = ptr;
            }
            else{
                ptr->next = cur;
                cur = ptr;
            }
            ptr = tmp;
            k++;
        }
        
        if(res == NULL){
            res = cur;
        }
        else pre->next = cur;
        
        tail->next = ptr;
        
        return res;    
    }
};
posted @ 2017-06-21 15:43  JeffLai  阅读(167)  评论(0编辑  收藏  举报