[leetcode] Reverse Linked List II

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.

思路:

一般链表反向的题目都是从前到后逐一反向,这个也不例外。bfore指向m的前一个节点(如果m=1,before=NULL)。start就是第m个节点,也就是开始反向的节点。end与after节点逐渐向后变化,end是after前面的那个节点,将after的next指向end。这两个节点的关系靠p来过渡。

题解:

/**
 * 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) {
        if(m==n)
            return head;
        ListNode *p = head;
        ListNode *before, *start, *end, *after;
        before=start=end=after=NULL;
        for(int i=1;i<m;i++) {
            before = p;
            p = p->next;
        }
        start=end=p;
        p = p->next;
        for(int i=m;i<n;i++) {
            after = p->next;
            p->next = end;
            end = p;
            p = after;
        }
        start->next = after;
        if(before!=NULL)
            before->next = end;
        else
            head = end;
        return head;
    }
};
View Code

 

posted on 2015-01-14 10:38  cha1992  阅读(88)  评论(0编辑  收藏  举报

导航