lc面试准备:Reverse Linked List II

1 题目

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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

接口

ListNode reverseBetween(ListNode head, int m, int n)

2 思路

采用就地反转链表。找到m节点,之后每读到一个结点,把它插入到m结点前面位置,然后m结点接到读到结点的下一个。
  • 第一步是找到m结点所在位置.
  • 第二步是从节点m到n依次反转指针.

复杂度

Time: O(n) 总共只需要一次扫描,所以时间是O(n)
Space: O(1) 只需要几个辅助指针,空间是O(1)。

3 代码

 1     public ListNode reverseBetween(ListNode head, int m, int n) {
 2         ListNode dummy = new ListNode(-1);
 3         dummy.next = head;
 4         ListNode prev = dummy;
 5         for (int i = 0; i < m - 1; i++) {
 6             prev = prev.next;
 7         }
 8         // 就地反转法
 9         ListNode dummy2 = prev;
10         prev = dummy2.next;
11         ListNode pCur = prev.next;
12         for (int i = m - 1; i < n - 1; i++) {
13             prev.next = pCur.next;
14             pCur.next = dummy2.next;
15             dummy2.next = pCur;
16             pCur = prev.next;
17         }
18         return dummy.next;
19     }

4 总结

常见的链表反转操作,反转链表的一部分。

5 扩展

熟练掌握链表反转的2种方法,适当运用。

6 参考

  1. 题目
  2. LeetCode:Reverse Linked List II
  3. Reverse Linked List II -- LeetCode

posted on 2015-03-03 16:54  BYRHuangQiang  阅读(659)  评论(0编辑  收藏  举报

导航