按给定大小k分组反转链表,现有代码输出异常如何正确实现?
问题分析
你现有代码的核心问题是没有预先判断剩余节点数量是否满足k个的要求,只要还有节点就会执行反转逻辑,哪怕最后一组不足k个也会被反转,这就是你得到不符合预期输出的原因:比如你测试用例应该是输入链表[1,2,3,4,5]、k=3的场景,按照要求最后剩余的2个节点[4,5]应该保持原有顺序,但你的代码把这两个也反转成了[5,4],所以最终输出[3,2,1,5,4],和预期的[3,2,1,4,5]不符。
正确实现步骤
- 首先遍历当前头节点往后的k个节点,确认剩余节点数≥k,如果不足直接返回当前头节点,不做任何修改
- 若节点数足够,执行k个节点的反转操作
- 将反转后的当前组的尾节点(即反转前的头节点)的next指针,指向递归处理后续节点返回的结果
- 返回当前组反转后的新头节点
修正后代码
class Solution { public static Node reverse(Node head, int k) { // 先判断剩余节点是否够k个 Node check = head; int count = 0; while (check != null && count < k) { check = check.next; count++; } // 不足k个直接返回原头节点 if (count < k) { return head; } // 够k个再执行反转逻辑 Node prev = null; Node curr = head; int c = 0; while(curr != null && c < k ) { Node next = curr.next; curr.next = prev; prev = curr; curr = next; c++; } // 递归处理后续节点,原头节点现在是当前组尾节点,对接后续处理结果 if(curr != null) { head.next = reverse(curr,k); } return prev; } }
内容的提问来源于stack exchange,提问作者jerry22
相关产品推荐
相关产品推荐

