61. 旋转链表

闭合为环

class Solution {
    public ListNode rotateRight(ListNode head, int k) {

        if (head == null || head.next == null || k == 0){
            return head;
        }

        ListNode dummyHead = new ListNode(0, head);
        ListNode last = dummyHead;
        int length = 0;

        /**
         * 先遍历链表得到链表长度,顺便得到尾节点last
         */
        while (last.next != null){

            length++;
            last = last.next;
        }

        /**
         * k对长度取余,就是要旋转的次数,即倒数第k % length个节点是新的头节点
         * 如果余数为0,说明不用旋转
         */
        if (k % length == 0){
            return dummyHead.next;
        }

        ListNode prev = dummyHead;
        for (int i = 0; i < length - (k % length); i++) {
            prev = prev.next;
        }

        dummyHead.next = prev.next;
        prev.next = null;
        last.next = head;

        return dummyHead.next;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

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

posted @ 2021-12-19 16:03  振袖秋枫问红叶  阅读(28)  评论(0)    收藏  举报