LeetCode - 61. Rotate List

這道題目提供了一個很好的思路,在遇到Linked List的問題時,當看似需要我們移動很多node的時候,我們可以直接移動指向頭節點的指針,而不是一個一個地去移動node。另外這道題目還有一個隱藏的陷阱,就是題目中給出的k可能是大於Linked List長度的,所以在解答這道題目的時候還要處理一下這一點。一些例子如下:

[1, 2, 3]; k = 2 -> [2, 3, 1]

可以直接將頭節點指向2,將3的next指向1,而將1的next指向null;rotate之後的頭節點爲原來的第length - k個節點

[1, 2, 3]; k = 5 -> [2, 3, 1]

這個例子的答案與上個例子一樣,因爲 5 % 3 == 2 % 3 == 2,而且rotate的方法也一樣;rotate之後的頭節點爲原來的第length - (k % length)個節點

所以根據上面的描述我們可以總結出這道題目的解法,使用兩個指針,將兩個指針分別指向原Linked List的頭節點和第length - (k % length) - 1個節點(因爲要將這個結點的next設置爲null),然後依照上面例子中的方法進行rotate。同時因爲這道題目中頭節點會發生變化,所以最好使用dummyNode,代碼如下:

/**
 * 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;      // corner case
        
        // Set dummyNode
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        
        // Set pointers
        ListNode fast = dummyNode;
        ListNode slow = dummyNode;
        
        // Find the length of list
        int l;
        for(l = 0; fast.next != null; l++){
            fast = fast.next;
        }
        
        // Set slow to the l - (k % l)the node
        for(int j = l - (k % l); j > 0; j--){
            slow = slow.next;
        }
        
        // Rotate list
        fast.next = dummyNode.next;
        dummyNode.next = slow.next;
        slow.next = null;
        
        return dummyNode.next;
    }
}


知識點:

1. 在Linked List中,如果需要移動的node有很多,那麼可以考慮是否可以直接移動頭節點的指針

2. dummyNode


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章