Leetcode 61. Rotate List 旋转链表
标签: Leetcode
题目地址:https://leetcode-cn.com/problems/rotate-list/
题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4 输出:2->0->1->NULL
解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL 向右旋转 3 步:0->1->2->NULL
向右旋转 4 步:2->0->1->NULL
算法思想
所谓的旋转就是向右移动多少位,对于链表的题目来说,移动位数,用两个结点就能在一遍遍历下完成,比如下面这个图片,我们如果想移动两位,只需要用p和q两个指针,q正常移动,p在q出发两步之后开始移动,所以两个差距就刚好是2,所以当q一定到尾部,p刚好就在q前面两个,我们这个时候把p.next=Null,q.next指向头,你会发现已经移位成功了。所以通过这个小技巧,我们通过单轮循环就能移动链表了。但是这个题目还有一点就是这个n可能超过链表长度,这个就更好解决了,直接取余即可。
python代码
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if head==None or head.next ==None:
return head
p = head
l = 0 # 长度
while p:
l+=1
p = p.next
p = head
q = head
i = 0
k = k%l
while p.next:
if i>=k:
q = q.next
p = p.next
i+=1
p.next = head
head = q.next
q.next = None
return head