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.
这道题是比较常见的链表反转操作,不过不是反转整个链表,而是从m到n的一部分。分为两个步骤,第一步是找到m结点所在位置,第二步就是进行反转直到n结点。反转的方法就是每读到一个结点,把它插入到m结点前面位置,然后m结点接到读到结点的下一个。总共只需要一次扫描,所以时间是O(n),只需要几个辅助指针,空间是O(1)。代码如下:
1.reverse 需要这么几个节点:
第一段尾节点(m的前一个节点), 第二段首节点(初始化为第二段第一个节点)、第二段遍历的节点(初始化为第二段第二个节点)-->作为第三段的首
mid tail mpointer
节点、第二段尾节点(即第二段第一个节点) ----npointer
2.dummyNode + m的前一个节点
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode prev = new ListNode(-1);
prev.next = head;
ListNode mpointer = prev; //point to m-1 position
ListNode npointer = prev; //point to n position
int index = 1;
while (index < m) {
mpointer = mpointer.next;
index++;
}
ListNode mid = mpointer;
ListNode tail = mpointer.next;
npointer = tail;
mpointer = tail.next;
//ListNode midHead = tail.next;
while (m < n) {
ListNode temp = mpointer.next;
mpointer.next = tail;
tail = mpointer;
mpointer = temp;
m++;
}
mid.next = tail;
npointer.next = mpointer;
return prev.next;
}