Bootstrap

LeetCode 61. 旋转链表

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。
组队打卡,更多解法等你一起来参与哦!

LeetCode 61. 旋转链表,难度中等

模拟

解题思路:具体看下方代码注释,大概思路如下:

  • 获取链表长度,计算出目标链表 newHead 的位置;
  • 然后将这两部分链表拆分并反过来拼接。
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || k == 0) return head;
        // 遍历获取数组长度并找到尾节点
        ListNode temp = head;
        int length = 1;
        while (temp.next != null) {
            length++;
            temp = temp.next;
        }
        ListNode tail = temp;

        // 移动次数先对链表长度取模,然后将指针移动到新链表的首节点上
        // 例如:[1, 2, 3, 4, 5, 6] k = 2
        // 移动两次,[3, 4, 5, 6, 1, 2] newHead = 3
        // 则当前 head = 1 节点需要移动 4 次
        // 我们需要找到 newHead 的前驱节点 2
        k = length - k % length;
        temp = head;
        // temp 为 newHead 的前驱节点
        for (int i = 0; i < k - 1; ++i) {
            temp = temp.next;
        }
        ListNode newHead = temp.next != null ? temp.next : head;
        // 判断 newHead 和 tail 节点是否同一节点
        if (tail == newHead) {
            newHead.next = head;
        } else {
            tail.next = head;
        }
        // newHead 前驱节点断尾
        // 该代码必须写在最后,否则当链表长度只有 1 的时候提前断尾会出现死循环
        temp.next = null;
        return newHead;
    }
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;