25.K个一组翻转链表

张开发
2026/4/10 2:01:11 15 分钟阅读

分享文章

25.K个一组翻转链表
package org.example; import java.util.Stack; class Solution { public ListNode reverseKGroup(ListNode head, int k) { // 校验 k 的值 if (k 1) { return head; } // 虚拟头结点 ListNode virtualHead new ListNode(0, head); // 指针指向当前正在遍历的结点 ListNode pointer virtualHead; // 栈用于将结点逆序 StackListNode stack new Stack(); while (pointer ! null || stack.size() k 1) { // 检查栈中的结点数量是否达到 k 1 个 if (stack.size() k 1) { // 当前结点入栈 stack.push(pointer); // 指针后移 pointer pointer.next; } else { // 栈中的结点数量已达到 k 1 个 // 用于记录两个关键的地址值 // 上一组的最后一个结点的地址 ListNode previous null; // 该组的第一个元素的地址 ListNode first null; // 该组的最后一个元素的地址 ListNode last null; // 该组后第一个结点的地址 ListNode after null; // 开始出栈并翻转该组 while (!stack.isEmpty()) { if (stack.size() k 1) { // 第一个出栈的元素将成为该组翻转后的第一个元素 first stack.peek(); // 第一个出栈的元素的 next 域记录着该组后第一个结点的地址 after stack.peek().next; } else if (stack.size() 2) { // 倒数第二个出栈的元素是该组的最后一个元素的地址 last stack.peek(); } else if (stack.size() 1) { // 最后一个出栈的元素是上一组的最后一个结点的地址 previous stack.peek(); } // 获取当前结点 ListNode node stack.pop(); // 改变当前结点的 next 域使其指向栈顶结点的地址 node.next stack.isEmpty() ? null : stack.peek(); } // 特殊结点处理 previous.next first; last.next after; // 移动指针 pointer last; } } return virtualHead.next; } }

更多文章