描述
给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数
样例
给出链表1->2->3->4->5->null和k=2
返回4->5->1->2->3->null
代码
整体思路是先遍历一遍链表,求出链表的长度size,随后size和k进行取余得到k,取余的目的是得到需要移动的最小距离。然后我们取倒数第k个节点,并且与前一个节点断开,然后与头节点进行连接。
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: the List
* @param k: rotate to the right k places
* @return: the list after rotation
*/
public ListNode rotateRight(ListNode head, int k) {
// write your code here
if(head==null||k==0||head.next==null){
return head;
}
ListNode fast=head,slow=head;
int count=0,size=0;
for(ListNode p=head;p!=null;p=p.next){
size++;
}
k=k%size;
if(k==0){
return head;
}
while(count<k){
fast=fast.next;
count++;
}
ListNode pre=slow,preFast=fast;
while(fast!=null){
pre=slow;
slow=slow.next;
preFast=fast;
fast=fast.next;
}
pre.next=null;
preFast.next=head;
head=slow;
return head;
}
}