📅  最后修改于: 2023-12-03 15:23:21.716000             🧑  作者: Mango
给定一个链表和两个整数 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 个节点,将这些节点插入到链表的末尾。具体来说,我们可以执行以下步骤:
下面是 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)。我们只需记录几个指针,空间复杂度是常数级别的。