外观
链表的每个节点右移K个位置
⭐ 题目日期:
字节 - 2024/9/19
🌳 题目描述:
例如:
- 输入:1 -> 2 -> 3 -> 4 -> 5, K = 2
- 输出:4 -> 5 -> 1 -> 2 -> 3
🧗难度系数:
⭐️ ⭐️ ⭐️
📝思路分析:
这道题要求我们找到一个合适的位置把链表切成两半,再将后面的一半放到前面,重新组装连接成一个新的链表。
💻代码:
Java
public ListNode moveKNodes(ListNode head, int k) {
if (head == null || head.next == null) {
return head;
}
int size = getListSize(head);
int moves = k % size;
ListNode cur = head;
for (int i = 0; i < size - moves - 1; i++) {
cur = cur.next;
}
if (cur.next == null) {
return head;
}
ListNode newHead = cur.next;
cur.next = null;
cur = newHead;
while (cur.next != null) {
cur = cur.next;
}
cur.next = head;
return newHead;
}
private int getListSize(ListNode head) {
int size = 0;
ListNode cur = head;
while (cur != null) {
size++;
cur = cur.next;
}
return size;
}
🚵🏻复杂度分析:
时间复杂度:O(n), n 为链表的长度
空间复杂度:O(1)