LeetCode 61旋转链表
LeetCode 61旋转链表
题目描述:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100 0 <= k <= 2 * 109
链接:https://leetcode.cn/problems/rotate-list
方法一:将链表首尾相连
- 遍历链表获得深度deep
- 对k取模得到最小旋转次数_k
- 将链表首尾相连后,通过head指针顺时针旋转cnt - k,得到旋转后的链表的头指针
方法二:双指针
这种方法看似很难理解,其实不然。旋转k次,实际上就是把链表尾部k个结点放到链表的前头。例如:
输入: [1,2,3,4,5] k = 3
输出: [3,4,5,1,2]
不难观察出,其实就是把长度为3的子链表[3,4,5]放在了[1,2]的前面。
所以,我们需要两个指针,在旋转链表前,将一个指向链表旋转后的尾部结点,另一个指向链表旋转前的尾部结点,同时,这两个结点距离为k(这里的k是取模后的k,即 0 <=k <= cnt)
图示操作
- 定义两个指针(p1, p2),共同指向第一个结点
- 让p2先向右移动k个结点
- 随后p1,p2同步移动
- 直到p2移动到最后一个结点
这里我们只需要将 p1 = NULL, p2 = head就可以得到向右旋转k次的链表啦😊
//代码