【Leetcode】61. 旋转链表(Rotate List)

No61. 旋转链表

题目

给定一个链表,旋转链表,将链表每个节点向右移动 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

解题代码(Python3)

class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head:
            return head
        #第一步 求长度 优化k 变成循环列表
        length = 1
        p = head
        while p.next:
            length += 1
            p = p.next
        k %= length
        if k == 0:
            return head
        p.next = head
        #第二步 拼接
        p = head
        i = 0
        while i < length - k - 1:
            i += 1
            p = p.next
        q = p
        p = p.next
        q.next = None
        return p

思路:

  1. 若空,返回head
  2. 若非空,求链表长度后计算k对length的余数,若为0则返回head,否则把链表改为循环列表
  3. 定位到目标位置后利用两个指针q和p(q在p前)将循环列表改回列表
  4. 返回p

相当于由一个右分散到聚合再到分散的过程。

复杂度分析:

  • 时间复杂度O(n)
  • 空间复杂度O(1) 没有额外空间开销

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113747646