【路飞】前端算法之旋转链表

136 阅读1分钟

旋转链表

题目

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

分析

截屏2021-12-19 下午10.27.22.png

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

我们可以先把链表看成一个环形链表,把最后的尾节点‘5’和头节点‘1’相连

截屏2021-12-19 下午10.49.48.png

因为k=2,所以把这个环形链接旋转两格,这个时候头节点就变成了‘4’,尾节点就变成了‘3’,最后再把头尾节点断开,就得到了最后移动2个位置后的链表结果。

截屏2021-12-19 下午10.53.16.png

代码

 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    //判断我们的这个节点是不是空的
    if(!head) return null;
    //找到我们链表的尾节点,串成环,获取到链表的长度
    let cur = head, size =1;
    while(cur.next) cur = cur.next, size +=1;
    cur.next = head;
    //找到第size-k个节点,然后将它断开
    for(let i =0; i < size - k % size -1; i++){
        head = head.next;
    }
    cur = head.next;
    head.next = null;
    return cur;
};