Problem:
Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanation: rotate 1 steps to the right: 5->1->2->3->4->NULL rotate 2 steps to the right: 4->5->1->2->3->NULLExample 2:
Input: 0->1->2->NULL, k = 4 Output:2->0->1->NULL
Explanation: rotate 1 steps to the right: 2->0->1->NULL rotate 2 steps to the right: 1->2->0->NULL rotate 3 steps to the right:0->1->2->NULL
rotate 4 steps to the right:2->0->1->NULL
Analysis:
本题的题意是将链表翻转k次,因为链表需要进行前后链接的操作,不像数组来得方便。所以本题采用模拟链表翻转的操作最终形成链表,但是需要注意的是k值,本题需要对k值进行优化,可以考虑到k值如果是链表节点数量的整数倍,则翻转的结果与原链表保持一致,因此可以对k值进行取模,得到最终的值。代码如下:
Code:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
ListNode p = head;
int cntNum = 0;
// count number of nodes
while(p != null) {
cntNum++;
p = p.next;
}
if(cntNum == 0)
return head;
k = k%cntNum; // calculate the effective k
if(k == 0)
return head;
ListNode res = new ListNode(-1);
res.next = null;
p = head;
ListNode pre = res;
int ans = cntNum - k;
while(ans > 0) {
// add new node
ListNode temp = new ListNode(p.val);
pre.next = temp;
pre = pre.next;
p = p.next;
ans--;
}
pre = res;
while(p != null) {
// add new node
ListNode temp = new ListNode(p.val);
temp.next = pre.next;
pre.next = temp;
pre = pre.next;
p = p.next;
}
return res.next;
}
}