描述
给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数
样例
给出链表1->2->3->4->5->null和k=2
返回4->5->1->2->3->null
思路:先算出链表的长度len,然后 k%len,可以得出实际移动的次数。
然后使用一个快慢指针,快的先走k步,然后一起移动,知道快的指针的next为null,停止。
这时 慢指针的next节点就是旋转后的头节点,然后指针重新设置下,就可以了。
代码:
public ListNode rotateRight(ListNode head, int k) {
// write your code here
if(head==null || k==0){
return head;
}
int len = 0;
ListNode h = head;
while (h!=null){
h = h.next;
len++;
}
k = k%len;
if(k==0){
return head;
}
ListNode quick = head;
ListNode slow = head;
for(int i=0;i<k;i++){
quick = quick.next;
}
while (quick.next!=null){
slow = slow.next;
quick = quick.next;
}
h = slow.next;
slow.next = null;
quick.next = head;
return h;
}