Leetcode链表旋转链表(61)
Posted Timeashore
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode链表旋转链表(61)相关的知识,希望对你有一定的参考价值。
题目
给定一个链表,旋转链表,将链表每个节点向右移动 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
解答
思路:先把链表首尾相连,再找到位置断开循环。
通过代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 时间复杂度O(n),空间复杂度O(1)
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next:
return head
# 标记尾节点
# 统计节点总数,防止k过大循环移动指针而超出时间限制
c, sum = head, 1
while c.next:
sum += 1
c = c.next
tail = c
c.next = head
p, c = head, head
p2 = p.next # 记录将来断开后的首节点
k = k%sum
# c先于p指针前k%num个
while k:
c = c.next
k -= 1
# 在p位置断开
while c != tail:
c = c.next
p = p.next
p2 = p.next
p.next = None
return p2
以上是关于Leetcode链表旋转链表(61)的主要内容,如果未能解决你的问题,请参考以下文章