本文共 1314 字,大约阅读时间需要 4 分钟。
解题思路
本题要求将给定一个头节点的链表,其中每k个节点为一个组,逆序交换这些组的顺序。例如,当k=2时,链表1→2→3→4→5→6→7→8→9→10,反转后的链表应为7→8→1→2→9→10→3→4→5→6。
实现思路如下:
首先检查特殊情况:如果链表为空或只有一个节点,直接返回原链表;如果k小于2,同样返回原链表。
创建一个辅助节点dummy,用于简化链表操作,其下一个节点指向原链表的头节点。
计算链表的总长度len。
遍历len/k次,每次处理一个k长度的组,将该组的节点逆序插入到结果链表中。
在每次处理k长度的组时,从当前节点开始,提取k个节点,逆序连接到辅助链表的末尾。
更新辅助链表的头节点和当前节点。
最终,返回dummy节点的下一个节点,即为反转后的链表。
代码实现
public class Solution { public static ListNode reverseKGroup(ListNode head, int k) { if (head == null || head.next == null || k < 2) { return head; } ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy, cur = head, temp; int len = 0; // 计算链表长度 while (head != null) { len++; head = head.next; } // 处理每k个节点的组 for (int i = 0; i < len / k; i++) { for (int j = 1; j < k; j++) { temp = cur.next; cur.next = temp.next; temp.next = pre.next; pre.next = temp; } pre = cur; cur = cur.next; } return dummy.next; }} 代码解释:
首先检查特殊情况,确保在处理前不会出错。
使用dummy节点简化链表操作,避免了多次创建临时节点。
计算链表长度len,用于确定需要处理多少组。
遍历len/k次,每次处理一个k长度的组。
在处理每个k长度的组时,逐个节点逆序连接到结果链表中。
更新辅助节点pre和cur,逐步构建反转后的链表。
这种方法通过逐步处理每k个节点的组,实现了对整体链表的逆序交换,时间复杂度为O(n),空间复杂度为O(1)。
转载地址:http://gser.baihongyu.com/