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.
A:
public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { ListNode header = new ListNode(0); header.next = head; ListNode preNode=header, runner = header;// preNode is the node before position m for(int i=0;i<n;i++){ if(i==m-1) preNode = runner; runner = runner.next; } // delete the node after preNode and insert it after runner while(preNode.next!= runner){ ListNode node = preNode.next; preNode.next = node.next; node.next = runner.next; runner.next = node; } return header.next; } }Mistakes:
1: 没有考虑从头结点开始reverse的时候, preNode 会是什么情况。 ------ 解决方法-------自己加了一个header 结点。 2: 虽然是从m...n 这些个位置,但是由于我们是把一个个的,detach,然后插到最前面。 因此, 不需要 detach 第一个 m的位置。---------这样就避免了null pointer exception。 3:考虑到有可能第一个node也被reverse了, 我们就不能直接返回开始的head, 而应该返回header.next。 Learned:
No comments:
Post a Comment