Leetcode 61:旋转链表

113 阅读1分钟

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL

示例 2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL

题解

这一题我采用的是先缝合再拆线的做法

最开始我想的是把初始链拆成两条链再连接,但是由于不是很方便找到切分点就没有成功。(其实不是找不到,是开始的时候没有想到k和切分点的关系)

61.png

第一步 我们要找到尾指针的位置(条件是next=null),顺便可以在找尾指针的时候把链表节点数算出来

然后第二步 我们要把头尾指针连成一个单项环

第三部 我们就可以开始找切入点把环切开了

var rotateRight = function(head, k) {
    if(head==null||head.next==null){return head;}
    var num = 1;//num表示p指针走过的节点数,相当于一个计数指针,最开始p指向头指针,所以num=1
    //这个函数是用来找尾指针的,返回的是尾指针
    var findLast = function(head){
        var p = head;
        while(p.next!==null){
            p = p.next;//p每走过一个节点,num的值就加一
            num++;
        }
        return p;
    }
    var last = findLast(head);
    last.next = head;//将尾指针的next指向head,即可连成闭环
    k = k%num;//去重取余(k可能大于num)
    var curr = head;
    //寻找需要断开的指针
    for(let i = 0;i<num-k-1;i++){
        curr = curr.next;
    }
    head = curr.next;
    curr.next = null;

    return head;
};