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

你可能感兴趣的:(list)