Reverse Nodes in k-Group

update Jul 29, 2017 14:56

LintCodearrow-up-right

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

You may not alter the values in the nodes, only nodes itself may be changed.

Only constant memory is allowed.

Example

Given this linked list: 1->2->3->4->5

For k = 2, you should return: 2->1->4->3->5

For k = 3, you should return: 3->2->1->4->5

Basic Idea:

这道题的难度应该远够不上 hard。

用到两个技术点,一是reverse linked list,二是reverse linked list中间的一段。后者是前者的扩展。

具体地,解法分成两部分:

  • ListNode getKth(ListNode head, int k);

这个函数对每个输入的head节点,找到从它开始第k个节点,若不存在,则返回null。

  • ListNode reverse(ListNode pre_head, ListNode tail);

这个函数 reverse 从pre_head.next 到 tail (include) 间的节点。之所以要传入要reverse的第一个节点之前的节点是为了整个list在reverse之后依然是连接的。

Python Code:

Java Code:

这种写法和之前的python写法不同。这里每次先将当前段的 k 个nodes与之后部分断开,然后调用reverse,再将其和前后重新连接,逻辑更加清晰;

udpate Jan 17,2018 11:54

Update (Recursion Solution)

严格上讲,这种 recursion 的解法是不符合 constant space 的要求的,但是这种写法更为简单,所以也提供一下。基本思路就是每次reverse完一组 k 个 nodes 之后,将其后的部分视作一个子问题,然后递归求解。

Java Code:

update Sep 15 2018, 18:39

Update, 更清晰的写法

  1. 每次reverse之前先将需要reverse的部分和后面断开,保存好这段之前的节点prev,之后的节点nextHead,这段的首位currHead和kth;

  2. reverse之后将之前存好的节点链接起来:prev.next = kth; currHed.next = next;, 然后更新下一段的变量:prev = currHead;;