【Leetcode】61. Rotate List

題目地址:

https://leetcode.com/problems/rotate-list/

給定一個單鏈表,再給定一個正整數kk,返回其向右旋轉kk步後得到的鏈表。旋轉11步指的是原鏈表的表尾連到了表頭上,並且把原表尾前一個節點與表尾切斷,把這個表尾當成新的鏈表頭。

思路是,先算出鏈表長度ll,然後旋轉kk次等價於旋轉k%lk\%l次。接着,先找到第lkl-k個節點,然後將鏈表尾連到鏈表頭上,最後將第lkl-k個節點與其下一個節點斷開,斷開後的下一個節點即爲新鏈表頭。代碼如下:

public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null) {
            return null;
        }
        
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;

		// 先算長度
        int len = 0;
        while (prev.next != null) {
            len++;
            prev = prev.next;
        }
        
        k %= len;
        // 接着找第len - k個節點
        prev = dummy;
        for (int i = 0; i < len - k; i++) {
            prev = prev.next;
        }
     
     	// 然後找尾節點,連到頭上
        ListNode tail = prev;
        while (tail.next != null) {
            tail = tail.next;
        }
        tail.next = head;

		// 此時prev.next就是新鏈表頭,然後還需要把prev和其後的節點斷開
        head = prev.next;
        prev.next = null;
        return head;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

時間複雜度O(n)O(n),空間O(1)O(1)

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