1. 题目
2. 解法
思路
这段代码的思路是:
- 使用一个虚拟节点 dummy 来简化代码,让它指向头节点。
- 使用三个指针 prev,curr 和 next 来遍历链表,其中 prev 指向当前反转的组的前一个节点,curr 指向当前反转的组的第一个节点,next 指向当前反转的组的下一个节点。
- 首先计算链表的长度 len,然后根据 len 和 k 判断是否需要反转当前的组。
- 如果需要反转,就使用头插法将 curr 和 next 之间的节点插入到 prev 和 curr 之间,重复 k - 1 次。
- 然后将 prev 和 curr 移动到下一组的位置,更新 len。
- 最后返回 dummy.next 作为新的头节点。
代码逻辑
具体实现
public class Solution { public ListNode reverseKGroup(ListNode head, int k) { // base case if (head == null || k == 1) return head; // dummy node to simplify the code ListNode dummy = new ListNode(0); dummy.next = head; // pointers ListNode prev = dummy; ListNode curr = head; ListNode next = null; // count the length of the list int len = 0; while (curr != null) { len++; curr = curr.next; } // reset curr to head curr = head; // loop through the list and reverse every k nodes while (len >= k) { // reverse k nodes for (int i = 1; i < k; i++) { next = curr.next; curr.next = next.next; next.next = prev.next; prev.next = next; } // move prev and curr to the next group prev = curr; curr = curr.next; // update len len -= k; } // return the new head return dummy.next; } }