旋转链表

101 阅读1分钟

旋转链表

要求:

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

思路

举例一个链表为1->2->3->4->5

1639629695(1).jpg

k值为2,则从3->4处断开,链表变为

微信截图_20211216124310.png

原先链表的尾节点5,下一节点为null

旋转后,5的下一节点为1

可以将链表首位相连,即

微信截图_20211216124535.png

再从length - k%length -1 处断开

即可返回旋转后的链表

微信截图_20211216124714.png

代码


var rotateRight = function (head, k) {
    // 当传进来的值为空,直接return
    if (!head) return null;
    let cur = head,
        pre = head,
        size = 1;
    // 使用while找到链表最后一个节点,并且保存链表的长度
    while (cur.next) {
        size += 1;
        cur = cur.next;
    }
    // while出来后,cur指向链表的最后一个节点,然后将链表首位相连
    cur.next = head;
    // 相连后,找到该断开的点
    // 举例:输入1->2->3->4->5,k=2,输出4->5->1->2->3
    // 即从3处断开,k=2,size=5,
    for (let i = 0; i < size - k % size -1; i++) {
        pre = pre.next;
    }
    let list = pre.next;
    pre.next = null;
    return list;
};