【路飞】61.旋转链表

129 阅读1分钟

旋转链表

题目描述:

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

提示:

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

解题思路:

k并没有规定小于或等于链表长度,因此k可以大于链表长度,实际向右移动的结果等同于n=k%len(len是链表长度)。

该题可以看成将倒数n个数移到链表最前面,倒数n+1个数指向null。

  1. 指针p指向倒数第n+1节点。
  2. 记录q为倒数n个数
  3. 将倒数n个数q和原链表倒数第n个节点之前的链表串连起来。因此,要记录原链表倒数第一个节点tail。
/**
 * 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 == null || head.next == null) return head;

    // 获得链表长度len
    var tail = head, len = 1;
    while(tail.next != null) {//这里用tail.next来判断而不是tail,是为了记录原链表最后一个节点。
        tail = tail.next;
        len++;
    }
    
    var n = k%len;//实际向右移动的个数
    if(n == 0) return head;

    var m = len - n;
    var p = head;
    while(--m){
        p = p.next;
    }
    var q = p.next;
    p.next = null;
    flag.next = head;
    return q;
};

自述

哈哈,我太开心了,这是我学习了六个链表算法后第一个没有参考别人的解题方法,并且在1个小时内完成的算法。

算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。