本文共 2098 字,大约阅读时间需要 6 分钟。
要解决这个问题,我们需要将给定的链表按照每 k 个节点一组进行翻转。如果链表长度不能被 k 整除,则最后剩余的节点保持原有顺序。以下是详细的解决方案。
class Solution { public ListNode reverseKGroup(ListNode head, int k) { // 统计链表长度 int length = 0; ListNode temp = head; while (temp != null) { length++; temp = temp.next; } // 如果k为1或者反转次数为0,直接返回原链表 if (k <= 1 || length % k == 0) { return head; } // 初始化虚拟头结点和当前处理的指针 ListNode nhead = new ListNode(-1); nhead.next = head; ListNode cur_head = nhead; // 保留下一次处理的起始位置 ListNode kNext = head; // 当前已完成的反转次数 int reverseTimes = 0; // 开始反转每组 while (length - reverseTimes * k > k) { // 找到当前组的尾节点 ListNode currentTail = cur_head.next; // 从头节点开始反转这组 // 使用头插法来进行反转 // 反转后的新头节点是当前组的最后一个节点 // currentnode -> next.next -> ... -> currentHead // 将currentHead插入到currentTail的位置 currentTail.next = cur_head.next; // 调整当前组的头和尾 cur_head = cur_head.next; // 新的头节点是第一个元素 currentTail = new ListNode(0); // 为了便于插入 // 将当前组反转插入到currentTail之后 while (cur_head != null && cur_head != nhead.next) { ListNode nextNode = cur_head.next; cur_head.next = currentTail; currentTail = cur_head; cur_head = nextNode; } // 将当前组的最后节点连接到下一个组的头 currentTail.next = kNext; // 调整kNext为下一个未处理的组的开始位置 kNext = cur_head.next; reverseTimes++; } return nhead.next; }}
转载地址:http://zegyk.baihongyu.com/