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.
这道题需要把1-2-3-4-5-变成1-4-3-2-5
也就是把2-3-4 变成4-3-2
所以2-3-4的头和尾显得非常重要
我们把2之前的元素作为头,2作为尾,然后3,4一次插入头的后面就可实现这个功能了。
也是就1-2-3-4-5中1作为头,2作为尾,3插入1后面就变成1-3-2, 4插入1的后面就变成1-4-3-2了。
这道题firstFix(头)好找,就是需要逆转的第一个元素的前面元素。
while(firstFix.next!=null && count<m) {
firstFix=firstFix.next;
count++;
}
if(firstFix.next==null)
return head;
然后就是依次插入了
采取5步法
1. 寻找插入元素: ListNode insert = lastFix.next;
2. 记录next元素: ListNode next = insert.next;
3. 把insert插到first的后面: insert.next=firstFix.next; firstFix.next=insert;
4. 连接断掉的部分(lastFix和next): lastFix=next;
5. 选定下一个插入元素并且count++: insert=next; count++;
下面是完整代码
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null)
return head;
ListNode helper = new ListNode(0);
helper.next = head;
ListNode firstFix = helper;
int count = 1;
while (firstFix.next != null && count < m) {
firstFix = firstFix.next;
count++;
}
ListNode lastFix = firstFix.next;
while (lastFix != null && lastFix.next != null && count < n) {
ListNode insert = lastFix.next;
ListNode next = insert.next;
insert.next = firstFix.next;
firstFix.next = insert;
lastFix.next = next;
insert = next;
count++;
}
return helper.next;
}