每k个节点一组反转链表
目录
每k个节点一组反转链表
系列文章目录
一、思路
每k个节点一组反转链表,最后节点不足k个的,保持不变
例如:
输入:1->2->3->4->5->6->7,k = 3
输出:3->2->1->6->5->4->7
思路:
使用虚拟头节点方便操作
每次处理一组k个节点
反转当前组内的节点
将反转后的组连接到前一部分
重复处理
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 虚拟头节点
ListNode dummy = new ListNode(0);
dummy.next = head;
// prev 是当前组的前一个节点
ListNode prev = dummy;
while (true) {
// 检查是否还有 k 个节点
ListNode curr = prev.next;
int count = 0;
while (count < k && curr != null) {
curr = curr.next;
count++;
}
if (count < k) break; // 不足 k 个,停止
// 反转当前组:从 prev.next 到 curr - 1
ListNode first = prev.next;
ListNode last = prev.next;
for (int i = 0; i < k - 1; i++) {
last = last.next;
}
// 反转区间 [first, last]
ListNode nextGroup = last.next;
ListNode prevNode = prev;
ListNode currNode = first;
// 反转 k 个节点
for (int i = 0; i < k; i++) {
ListNode next = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = next;
}
// 连接反转后的组
prev.next = prevNode;
first.next = nextGroup;
// 更新 prev 为当前组的最后一个节点(即原来的第一个节点)
prev = first;
}
return dummy.next;
}
// 测试代码
public static void main(String[] args) {
// 构建链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
ListNode node1 = new ListNode(1);
node1.next = new ListNode(2);
node1.next.next = new ListNode(3);
node1.next.next.next = new ListNode(4);
node1.next.next.next.next = new ListNode(5);
node1.next.next.next.next.next = new ListNode(6);
node1.next.next.next.next.next.next = new ListNode(7);
Solution solution = new Solution();
ListNode result = solution.reverseKGroup(node1, 3);
// 打印结果
while (result != null) {
System.out.print(result.val + " ");
result = result.next;
}
}
}