1 解题思想
题目的意思是如果有一个链表,现在让你循环向右位移K步,得到一个新的开头的链表,例子可以看原题的实例。
首先有一个你要明白的是,向右移动的K步,可能会大于链表的长度N,于是乎你需要这么做:
1、遍历一次链表,得到链表长度N,并且将链表的尾巴连接到头结点上。
2、从head开始走n-k%n步的位置那里断开成一个新的链表,那个就是移动后的额结果
3、将断开的位置当做新的头结点返回,记得断开的时候别忘了把断开的位置尾巴设置为null(这也是为什么说断开)
2 原题
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.
3 AC解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
/**
* 首尾连城一个环,这样可以从head开始走n-k%n步的位置那里断开成一个新的链表,那个就是移动后的额结果*/
public ListNode rotateRight(ListNode head, int k) {
if(head==null)
return null;
//首尾连成一个环
ListNode p=head;
int n=1;
while(p.next !=null){
n++;
p=p.next;
}
p.next=head;
//计算实际步伐,单链表
k=n-k%n;
p=head;
while(k-->1){
p=p.next;
}
head=p.next;
p.next=null;
p=head;
return head;
}
}