题目描述:给你一个链表的头节点 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]
方法一:闭合为环
根据题意,我们可以假设链表是:1 -> 2 -> 3 -> 4 -> 5,移动位是 k,我们分析如下:
k < 5 的情况:实际移动的位数,就是 k 本身。
k > 5 的情况:
k 是 5 的整数倍:链表不会发生位置变化。
k 不是 5 的整数倍:实际移动位数是 k%5 的值。
知道了上述的分析,我们很容易就能理清思路,流程如下:
- 计算链表的长度
- 链表最后一位值的 next 指向原链表首位数字,形成闭环,如下所示:
1 | // 环图 |
- 创建一个变量,接收从 k 处截断后的链表,假设 k = 2,我们就会从 3 这里处截断,然后 3 的 next 指向 null 即可,所以该变量的值是 4 -> 5 -> 1 -> 2 -> 3 -> null。
1 | /** |
复杂度分析
- 时间复杂度:O(n),最坏情况下,我们需要遍历该链表两次。
- 空间复杂度:O(1),我们只需要常数的空间存储若干变量。
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:37.7 MB, 在所有 Java 提交中击败了70.11%的用户