【链表】Rotate List(三个指针)

时间:2024-04-22 09:17:21

题目:

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.

思路:

首先要弄清题目的意思:旋转链表k个位置,这里旋转一次表示从链表尾部拿一个节点放到链表头部,因此当k等于链表长度的整数倍时,相当于链表又还原到原来的状态。

设链表长度为n,k = k % n, 则题目的意思是相当于把链表的后k个节点放到链表头部,因此我们只需要找到链表的倒数第k个节点,然后让尾节点指向头结点,倒数第k+1个节点的next指向NULL。当然要注意边界条件,例如k刚好是链表长度的整数倍。

对于找到链表的倒数第k个节点,可以用双直针的方法,第一个指针先指向第k个节点,第二个指针指向头结点,然后两个节点一起前进,当第一指针指向尾节点时,第二个指针就指向倒数第k个节点。

/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var rotateRight = function(head, k) {
if(head==null||head.next==null||k==0){
return head;
} var r=head,l=head,l_pre=null;
var p=head,len=1;
while(p.next!=null){
p=p.next;
len++;
}
k=k%len;
if(k==0){
return head;
}
for(var i=1;i<k;i++){
r=r.next;
if(r==null){
r=head;
}
} while(r.next){
r=r.next;
l_pre=l;
l=l.next;
} if(l_pre==null){
return head;
}
r.next=head;
l_pre.next=null;
return l; };