61. 旋转链表
61. 旋转链表
题意
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数;
解题思路
快的先移动k个结点,然后再让慢的和快的一起移动,最后慢的就可以到达倒数第k个结点,最后将快的指向慢的即可,然后再移动这里需要注意的是,如果k超出链表长度的话,有两种情况,如果是能整除的话,则和原来一样,如果不能整除的,则按照题目要求旋转链表。
实现
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head or k == 0:
return head
# 计算链表长度,用于计算旋转的位置,比如超出链表长度
temp = head
le = 0
while temp:
le += 1
temp = temp.next
if k >= le:
k %= le
if k == 0:
return head
else:
slow, fast = head, head
for _ in range(k):
fast = fast.next
pre_slow, pre_fast = slow, fast
while fast:
pre_slow, pre_fast = slow, fast
slow, fast = slow.next, fast.next
pre_slow.next = None
if pre_fast:
pre_fast.next = head
return slow
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法