天天看點

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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/rotate-list
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。           

示例 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

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/rotate-list
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。           
/**
 * 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) {

        // 如果為空,或者連結清單隻有1個元素 或者k為0,不移動位置
        if(null == head || null == head.next || k == 0){
            return head;
        }
        
        int len = 1;
        ListNode end = head;
        // 周遊連結清單,計算對外連結表的長度len
        while(null != end.next){
            end = end.next;
            len++;
        }

        //System.out.println(len);
        k = k%len; // 移動的位置k對長度len取模
        ListNode p = head; 
        for(int i=0; i<len - k - 1; i++){
            p = p.next; // 找到從哪個節點斷開
        }

        end.next = head;
        head = p.next; // 新的頭部
        p.next = null;
        
        return head;
    }
}