一、题设
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
二、基本思路
法一:想着暴力循环k次,每次整体移动一次。这样大概做了k次循环,结果发现有样例k = 2000000000,真是残暴啊,这样就会至少做2000000000次循环,最终导致内存出错,这也是我第一次在力扣上碰到内存错误的情况哈哈。本题应该也是不让你用这样解的。
法二:首尾相连成循环链表,根据链表长度n和移动的k次找出断点。那么问题就是断点怎么求?
通过上面两个例子不难发现,v再走(n - k % n)次后,v即为新链表的尾部,v.next即为新链表的头部。
三、代码实现
法一:
def rotateRight(self, head, k):
if not head or k == 0 or not head.next:
return head
for i in range(k):
v = head
fast = v.next
while fast.next:
v = v.next
fast = fast.next
v.next = None # 封尾
fast.next = head
head = fast
return head
法二:
def rotateRight(self, head, k):
if not head or k == 0:
return head
lens = 1
v = head
while v.next:
v = v.next
lens += 1
# 连成循环链表
v.next = head
for i in range(lens - k % lens):
v = v.next
head = v.next
v.next = None
return head
四、效率总结