🤖
AI审核中

NC50 链表中的节点每k个一组翻转

本文介绍了“链表每k个节点翻转”问题:在不修改节点值、空间O(1)、时间O(n)的限制下,将链表按k为一组逆序,若不足k则保持原序。给出示例及边界情况。核心思路是先检查当前段是否至少有k个节点,若不足直接返回;否则使用迭代逆转当前k段节点,逆转后递归处理后续子链表,并将原段首节点连接到递归返回的子链表头。代码实现简洁,利用指针pre、cur、tail完成局部翻转并递归链接。

文章摘要

本文介绍了“链表每k个节点翻转”问题:在不修改节点值、空间O(1)、时间O(n)的限制下,将链表按k为一组逆序,若不足k则保持原序。给出示例及边界情况。核心思路是先检查当前段是否至少有k个节点,若不足直接返回;否则使用迭代逆转当前k段节点,逆转后递归处理后续子链表,并将原段首节点连接到递归返回的子链表头。代码实现简洁,利用指针pre、cur、tail完成局部翻转并递归链接。

题目链接:https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

题目描述

将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。

数据范围:0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)

例如:

给定的链表是 1→2→3→4→5

对于 k = 2 , 你应该返回 2→1→4→3→5

对于 k = 3 , 你应该返回 3→2→1→4→5

示例 1:

输入:{1,2,3,4,5},2
返回值:{2,1,4,3,5}

示例 2:

输入:{},1
返回值:{}

解题代码

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    public ListNode reverseKGroup (ListNode head, int k) {
        // write code here
        //找到每次翻转的尾部
        ListNode tail = head;
        //遍历k次到尾部
        for (int i = 0; i < k; i++) {
            //如果不足k到了链表尾,直接返回,不翻转
            if (tail == null)
                return head;
            tail = tail.next;
        }
        //翻转时需要的前序和当前节点
        ListNode pre = null;
        ListNode cur = head;
        //在到达当前段尾节点前
        while (cur != tail) {
            //翻转
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        //当前尾指向下一段要翻转的链表
        head.next = reverseKGroup(tail, k);
        return pre;
    }
}
0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论