[61] 旋转链表

复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * function ListNode(val, next) {
 4  *     this.val = (val===undefined ? 0 : val)
 5  *     this.next = (next===undefined ? null : next)
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} head
10  * @param {number} k
11  * @return {ListNode}
12  */
13 var rotateRight = function (head, k) {
14     //  链表为空 || 链表只有一个节点 || 旋转数量为0
15     if (!head || !head.next || k === 0) {
16         return head;
17     }
18     // 使用一个指针,统计链表长度
19     let node = head;
20     // 统计节点数量,指针初始指向头结点,因此初始值为1
21     let length = 1;
22 
23     // 不断移动指针,但它停在尾结点时,完成链表长度的统计
24     while (node.next) {
25         node = node.next;
26         length++;
27     }
28     let rotate = k % length; // 链表旋转节点数量,k可能大于链表长度,因此需要取余
29 
30     // 如果rotate为0,无需旋转,直接返回即可
31     if (rotate === 0) {
32         return head;
33     }
34 
35     // 将尾结点与头结点连接,让链表形成环
36     node.next = head;
37     let breakNode = head; // 使用指针,最终会指向断点位置
38     let breakPoint = length - rotate - 1; // 将指针移动到断点位置所需次数
39 
40     // 将指针移动到断点位置
41     while (--breakPoint >= 0) {
42         breakNode = breakNode.next;
43     }
44 
45     // 链表的新头结点,就在断点位置的下一个节点
46     const newHead = breakNode.next;
47     // 将链表的环打断
48     breakNode.next = null;
49 
50     // 返回新链表
51     return newHead;
52 };
复制代码

 

posted @   人恒过  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示