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.
Solution:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(m==n) return head;
ListNode fakeHead = new ListNode(0);
fakeHead.next=head;
ListNode first = fakeHead;
int i=0;
for(; i<m-1; i++){
first=first.next;
}
ListNode tail=first.next;
ListNode prev = tail, cur=prev.next, next;
for(i=m;i<n;i++) {
next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
first.next=prev;
tail.next=cur;
return fakeHead.next;
}
}Note:先保存下点m-1。从点m到点n,将list反序,在这过程中需要保存反序部分的尾部tail,反序最后一步的prev节点就是反序节点的头部。然后将反序的list接入原list中,between节点m-1和n+1。

5万+

被折叠的 条评论
为什么被折叠?



