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;
}
}
浙公网安备 33010602011771号