每日算法 -- 链表
61. 旋转链表
分析
- 先遍历一次求出链表的长度len,取余可以知道真正移动的步数 k
- 然后快慢指针求出旋转点的切点 prev,这是 prev 是旋转后的表尾,prev.next 是表头,需要注意的是,快指针走到 null 的时候,需要重新拼接到原始头指针
- 这个时候只需要保存新的头节点,然后将头尾节点打断,就可以得出新的链表了。
// 61. 旋转链表
// https://leetcode-cn.com/problems/rotate-list/
/**
* @分析
* 1. k 可能会比head 长,所以实际移动的是 k%len,其中 len 是链表的长度
* 2.
*/
function rotateRight(head: ListNode | null, k: number): ListNode | null {
if (!head) return head;
let len = 0,
temp = head;
while (temp) {
len++;
temp = temp.next;
}
k %= len; // 实际要移动的长度
let emptyNode = new ListNode();
emptyNode.next = head;
let prev = head;
// 双指针求出移动后k+1那一段
while (head && head.next) {
if (k) {
k--;
} else {
prev = prev.next;
}
head = head.next;
}
head.next = emptyNode.next;
// 这个时候 prev.next 就是旋转后的投,prev 就是尾
// 但是现在原始链表的头和尾还没有链接起来
const res = prev.next;
prev.next = null;
return res;
}
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情