92. 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->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; }