🌐 AI搜索 & 代理 主页

0061. 旋转链表

题目地址(61. 旋转链表)

https://leetcode-cn.com/problems/rotate-list/

题目描述

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

快慢指针法

前置知识

  • 求单链表的倒数第 N 个节点

思路一

  1. 采用快慢指

  2. 快指针与慢指针都以每步一个节点的速度向后遍历

  3. 快指针比慢指针先走 N 步

  4. 当快指针到达终点时,慢指针正好是倒数第 N 个节点

思路一代码

  • 伪代码

  • 语言支持: JS

JS Code:

思路二

  1. 获取单链表的倒数第 N + 1 与倒数第 N 个节点

  2. 将倒数第 N + 1 个节点的 next 指向 null

  3. 将链表尾节点的 next 指向 head

  4. 返回倒数第 N 个节点

例如链表 A -> B -> C -> D -> E 右移 2 位,依照上述步骤为:

  1. 获取节点 C 与 D

  2. A -> B -> C -> null, D -> E

  3. D -> E -> A -> B -> C -> nul

  4. 返回节点 D

注意:假如链表节点长度为 len, 则右移 K 位与右移动 k % len 的效果是一样的 就像是长度为 1000 米的环形跑道, 你跑 1100 米与跑 100 米到达的是同一个地点

思路二代码

  • 伪代码

  • 语言支持: JS, JAVA, Python, CPP, Go, PHP

JS Code:

JAVA Code:

Python Code:

CPP Code:

Go Code:

PHP Code:

复杂度分析

  • 时间复杂度:节点最多只遍历两遍,时间复杂度为$O(N)$

  • 空间复杂度:未使用额外的空间,空间复杂度$O(1)$

最后更新于

这有帮助吗?