首页 > 代码库 > [leetcode] Reverse Linked List II

[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

 

[leetcode] Reverse Linked List II