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
.
分析:注意k有可能会大于list的长度,所以先求出list长度 len, 然后 k = k % len,
举个例子, 1 -> 2 -> 3, k = 1, 则翻转后 得到 3 -> 1 -> 2, 新的head是原list中 第 len - k 个 node的 next node,所以找到 (len - k)th node
这里还是运用了dummy node,这样找长度也好找第几个node也好,循环结束之后当前node不为null,可以直接令 node.next = xxx来做操作
私以为这种做法比Code Ganker大牛的解法清晰一些。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null)
return head;
int len = 0;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode fast = dummy;
while(fast.next != null){
len++;
fast = fast.next;
}
k = k % len;
if(k == 0)
return head;
// find the len - k th node, the next node of it will be the new head;
ListNode slow = dummy;
int i = 0;
while(i < len - k && slow.next != null){
slow = slow.next;
i++;
}
ListNode newHead = slow.next;
fast.next = head;
slow.next = null;
return newHead;
}
}