旺崽的博客

要么天赋异禀,要么天道酬勤

0%

LeetCode 61 旋转链表

题目链接

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

在这里插入图片描述

1
2
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

在这里插入图片描述

1
2
输入:head = [0,1,2], k = 4
输出:[2,0,1]

简单链表操作,我们注意到移动的次数 k 可能会大于链表长度,所以必须要取模,这样一来移动的可能性只会为 [0,len-1],而 0 就相当于没移动,所以我们只需要只需要遍历一下列表,将左边 len-k 的部分拼接到右边的末尾即可,AC 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head: # 判空
return head
cnt, l = 0, 0
p = head # 计算链表长度
while p:
p = p.next
l += 1
p = head
left = p # 链表右移的部分
k = k % l if k % l else l # 取模
while p:
cnt += 1
if cnt == l - k:
break
p = p.next
if not p: # 移到距离刚好等于链表长度的话相当于没动
return head
right = p.next # 链表左移的部分
p.next = None
p = right
while p.next:
p = p.next
p.next = left
return right