【算法】【线性表】【链表】旋转链表

1  题目

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10^9

2  解答

先对 k 降级,然后找断点,然后拼接两个链表即可:

复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        // 参数边界校验
        if (head == null || head.next == null || k <= 0) {
            return head;
        }
        // 计算节点的数量
        int sum = 0;
        ListNode node = head;
        while (node != null) {
            sum ++;
            node = node.next;
        }
        // 对 k 进行降级
        // 比如 长度为5 k=7,那么其实就是和k=2的效果一样的
        k = k % sum;
        // 如果降级后为0,直接返回吧
        if (k == 0) {
            return head;
        }
        // 这道题其实就是把链表变成了两段
        // 比如sum 长度 = 5
        // k = 2
        // 其实就是把第3(5-2)个后边的元素都移到前边
        // 还是照常我喜欢加一个头节点
        ListNode preNode = new ListNode(0);
        preNode.next = head;
        node = preNode;
        // 计数器 计算遍历到第几个节点了,然后当count == target时,就把后边的元素放到前边
        // 这个后边的移到前边就是断点后的最后一个元素的next 指向preNode.next即可。
        int target = sum - k;
        int count = -1;
        while (node != null) {
            count ++;
            // 到达第 k 个元素 到达断点
            if (count == target) {
                break;
            }
            node = node.next;
        }
        ListNode markNode = node, markNextNode = node.next;
        // 遍历到尾部
        while (node.next !=null) {
            node = node.next;
        }
        // 尾部的next 指向preNode.next 首位连接
        node.next = preNode.next;
        // 然后把断点的元素的next 设置为空
        markNode.next = null;
        // 然后返回断点的起始元素
        return markNextNode;
    }
}
复制代码

加油。

posted @   酷酷-  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示