注意先获取链表长度len, k = k % len
解法一:最简单,一次移一位
public class Solution {
public ListNode rotateRightOnce(ListNode head){
ListNode runner = head;
while(runner.next.next != null){
runner = runner.next;
}
ListNode newHead = runner.next;
runner.next.next = head;
runner.next = null;
return newHead;
}
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null)
return head;
ListNode runner = head;
int len = 0;
while(runner != null){ //get list length
len ++;
runner = runner.next;
}
k = k % len;
ListNode finalHead = head;
for(int i = 0; i < k; i ++)
finalHead = rotateRightOnce(finalHead);
return finalHead;
}
}
解法二:直接找到新的头和尾(采用一个快慢指针的方法,平移),直接处理
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null)
return head;
ListNode runner = head;
int len = 0;
while(runner != null){ //get list length
len ++;
runner = runner.next;
}
k = k % len;
if (k == 0) //注意k==0的话,下面会出错
return head;
ListNode fastRunner = head;
for(int i = 0; i < k; i ++)
fastRunner = fastRunner.next;
ListNode slowRunner = head;
while(fastRunner.next != null){
fastRunner = fastRunner.next;
slowRunner = slowRunner.next;
}
ListNode newHead = slowRunner.next;
slowRunner.next = fastRunner.next; //null
fastRunner.next = head;
return newHead;
}
}
解法3:
1.计算出k=k % len
还可以把头尾相接,然后再解开