给定一个链表,旋转链表,将链表每个节点向右移动 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和切分点的关系)
第一步 我们要找到尾指针的位置(条件是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;
};