leetcode---61. 旋轉鏈表

給定一個鏈表,旋轉鏈表,將鏈表每個節點向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: 1->2->3->4->5->NULL, k = 2
輸出: 4->5->1->2->3->NULL
解釋:
向右旋轉 1 步: 5->1->2->3->4->NULL
向右旋轉 2 步: 4->5->1->2->3->NULL
示例 2:

輸入: 0->1->2->NULL, k = 4
輸出: 2->0->1->NULL
解釋:
向右旋轉 1 步: 2->0->1->NULL
向右旋轉 2 步: 1->2->0->NULL
向右旋轉 3 步: 0->1->2->NULL
向右旋轉 4 步: 2->0->1->NULL

思路:每個節點都向右移動,需要考慮k>n和看k<n兩種 ,當k>n的時候實際移動效果和k%n的次數是一樣的。所以我們統一按照k%n來考慮。 向右移動實際就是將倒數k個拿掉掛到前面。這個時候需要注意的是旋轉後的鏈表

1、頭指針指向改變

2、新的尾結點需要指向爲空。

那麼如何找頭和尾,將倒數k個掛在原來的頭,那麼倒數第k個(正着數就是第n-k+1)就是新鏈表的頭 倒數第k+1(n-k)個就是新鏈表的尾巴。

首先第一步求出鏈表的長度,然後從head開始走n-k-1步到達第n-k個結點,找到新的尾巴和新的頭。

 public ListNode rotateRight(ListNode head, int k) {
        if (null == head || null == head.next) {
            return head;
        }
        ListNode cur = head;
        int n = 1;
        while (null != cur.next) {
            cur = cur.next;
            n++;
        }
        //成環 首尾相連
        cur.next = head;
        //倒數第k個是正數第n-k+1,這個將會是旋轉後的第一個結點 head指向它 正數第n-k個是旋轉後的尾結點
        ListNode new_tail = head;
        for (int i = 0; i < (n - k % n) - 1; i++) {
            new_tail = new_tail.next;
        }
        //找到新的頭
        ListNode new_head = new_tail.next;
        //新的尾結點指向null
        new_tail.next = null;
        return new_head;
    }

 

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