题目
给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数
样例
给出链表1->2->3->4->5->null和k=2
返回4->5->1->2->3->null
解题
找到第k个结点
找到最好一个结点
最后一个结点链接到头结点
第k个结点后面断开
/**
* Definition for singly-linked list.
* 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(k<0)
return null;
if(k==0||head==null || head.next==null)
return head;
int size = size(head);
k = k%size;
k = size - k;
ListNode kNode = head;
while(k>1){ // 找到第 k个结点
k--;
kNode = kNode.next;
}
ListNode lastNode = kNode;
while(lastNode.next!=null){ // 找到最好一个结点
lastNode = lastNode.next;
}
lastNode.next = head; // 最后一个结点链接到头结点
ListNode newHead = kNode.next; // 新的头结点是 k + 1 结点
kNode.next =null; // 第k个结点后断开
return newHead;
}
public int size(ListNode head){
ListNode p = head;
int size = 0;
while(p!=null){
p = p.next;
size++;
}
return size;
}
}