題意:給出一個列表,往右旋轉 k 個位置。
例子:給定鏈表 1->2->3->4->5->NULL 並且 k = 2,
返回鏈表 4->5->1->2->3->NULL.
分析:題目比較簡單,分爲三個部分來做。
1、計數,得到鏈表的長度。
2、找到新鏈表頭部節點在舊鏈表中的前置節點,如上述例子中的節點3,同時節點3也是新鏈表的尾部。
3、進行對順序變換的操作:
如果以fastNode指代節點5,slowNode指代節點3的話,該順序變換的操作爲:
fastNode.next = dummy.next;
dummy.next = slowNode.next;
slowNode.next = null;
值得注意的是,往右旋轉k個位置,k有可能大於鏈表的長度,此時如果已經轉了一遍的話,要再接着轉,即在找slowNode時要進行k%len的操作。
那麼代碼就很容易寫出來了:
/**
* 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) {
if(head == null || head.next == null) return head;
int len = 1;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode fastNode = head;
while(fastNode.next != null){
fastNode = fastNode.next;
len++;
}
ListNode slowNode = head;
for(int i = 0; i < len - k % len - 1; i++){
slowNode = slowNode.next;
}
fastNode.next = dummy.next;
dummy.next = slowNode.next;
slowNode.next = null;
return dummy.next;
}
}