leetcode題解-61. Rotate List

題意:給出一個列表,往右旋轉 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;

    }
}
發佈了119 篇原創文章 · 獲贊 149 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章