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 个节点
思路一
采用快慢指
快指针与慢指针都以每步一个节点的速度向后遍历
快指针比慢指针先走 N 步
当快指针到达终点时,慢指针正好是倒数第 N 个节点
思路一代码
伪代码
语言支持: JS
JS Code:
思路二
获取单链表的倒数第 N + 1 与倒数第 N 个节点
将倒数第 N + 1 个节点的 next 指向 null
将链表尾节点的 next 指向 head
返回倒数第 N 个节点
例如链表 A -> B -> C -> D -> E 右移 2 位,依照上述步骤为:
获取节点 C 与 D
A -> B -> C -> null, D -> E
D -> E -> A -> B -> C -> nul
返回节点 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)$
最后更新于
这有帮助吗?