📜  在 Y 节点组中将链表左旋转 X(1)

📅  最后修改于: 2023-12-03 15:23:21.716000             🧑  作者: Mango

在 Y 节点组中将链表左旋转 X
问题描述

给定一个链表和两个整数 X 和 Y,要求将链表从第 Y 个节点开始的链表左旋转 X 个节点。

示例

假设链表为 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7,X = 2,Y = 3,则左旋转后的链表为 1 -> 4 -> 5 -> 6 -> 7 -> 2 -> 3。

解决方案

我们可以先根据给定的 Y 值找到链表中的第 Y 个节点,然后从该节点开始,遍历 X 个节点,将这些节点插入到链表的末尾。具体来说,我们可以执行以下步骤:

  1. 找到第 Y 个节点。
  2. 记录第 Y 个节点的前驱节点。
  3. 遍历 X 个节点,记录当前节点和当前节点的后继节点。
  4. 将当前节点的后继节点置为 null,将该节点的前驱节点的后继节点置为 X 个节点后的节点。
  5. 将记录的 X 个节点的后继节点指向链表的末尾。

下面是 Java 代码实现:

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
    }
}

public class Solution {
    public static ListNode rotateList(ListNode head, int X, int Y) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prevY = dummy;
        for (int i = 0; i < Y; i++) {
            prevY = prevY.next;
        }
        ListNode curr = prevY.next;
        for (int i = 0; i < X; i++) {
            curr = curr.next;
        }
        ListNode prevX = prevY.next;
        ListNode nextX = curr.next;
        curr.next = null;
        prevY.next = prevX.next;
        prevX.next = nextX;
        ListNode tail = prevX;
        while (tail.next != null) {
            tail = tail.next;
        }
        tail.next = nextX;
        return dummy.next;
    }
}
复杂度分析

时间复杂度:O(Y+X),其中 Y 是链表的长度,X 是左旋转的节点数。我们需要遍历找到第 Y 个节点,以及找到从 Y 开始的 X 个节点。

空间复杂度:O(1)。我们只需记录几个指针,空间复杂度是常数级别的。