旋转链表

问题描述

给你一个链表的头节点 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 * 109

Java代码

复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode rotateRight(ListNode head, int k) {
13         if (head == null) {
14             return head;
15         }
16         // 当k = 0  或者只有一个元素的时候,都直接返回head即可
17         if (k == 0 || head.next == null) {
18             return head;
19         }
20 
21         // 计算出链表的长度
22         int len = 0;
23         ListNode p = head;
24         ListNode tail = null;
25         while (p != null) {
26             len++;
27             if (p.next == null) {
28                 tail = p;
29                 break;
30             }
31             p = p.next;
32         }
33 
34         if (k % len == 0) {
35             return head;
36         }
37 
38         // 变为环
39         tail.next = head;
40 
41         // 计算出移动后的尾节点(下标从0开始)
42         int x = len - k % len;
43 
44         while (x > 0) {
45             tail = tail.next;
46             x--;
47         }
48         // 找到尾节点,尾节点前面一个就是头节点
49         ListNode newHead = tail.next;
50         // 将尾节点的next设置为null
51         tail.next = null;
52         return newHead;
53     }
54 }
复制代码

leetcode链接

posted @   没有你哪有我  阅读(67)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示