Python 数据结构之旋转链表

yizhihongxing

Python 数据结构之旋转链表

简介

在进行链表操作时,有时需要旋转链表的一部分,即将链表的最后几个节点移到链表的头部。本文将讲解 Python 实现旋转链表的方法。

方法

我们需要了解两个概念:旋转链表、链表反转。

旋转链表

假设链表为1-2-3-4-5,k=2,将链表后两个节点移动到链表头部,即转化为4-5-1-2-3。

做法如下:

  1. 先遍历链表,得出链表长度 n。
  2. 计算旋转的位置,即计算出在第几个节点处将链表切开(分成两个链表),并将原链表的最后一个节点指向原链表头结点。
  3. 再次遍历链表,将切开的两个链表分别反转。
  4. 将反转后的前链表的尾结点指向反转后的后链表的头结点,即可得到最终链表。

链表反转

假设链表为1-2-3-4-5,反转后变为5-4-3-2-1。

做法如下:

  1. 依次遍历链表,记录上一个节点和当前节点。
  2. 将当前节点的 next 指向上一个节点。
  3. 将上一个节点更新为当前节点,将当前节点往后移,继续遍历,直到结束。

代码示例

旋转链表

class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head or not head.next or k == 0:
            return head

        # 计算链表长度
        length = 1
        p = head
        while p.next:
            p = p.next
            length += 1

        # 计算旋转位置
        k %= length
        if k == 0:
            return head
        p.next = head # 首尾相连
        cut = length - k
        p = head
        for i in range(cut-1):
            p = p.next
        new_head = p.next
        p.next = None

        # 反转链表
        old_head = head
        new_head = self.reverseList(new_head)
        head = self.reverseList(old_head)
        old_head.next = new_head

        return head

    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        pre = None
        cur = head
        while cur:
            next_node = cur.next
            cur.next = pre
            pre = cur
            cur = next_node
        return pre

示例

示例1:

链表:1-2-3-4-5, k=2

旋转后链表:4-5-1-2-3

s = Solution()
head = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
head.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
k = 2
new_head = s.rotateRight(head, k)
while new_head:
    print(new_head.val)
    new_head = new_head.next

输出:

4
5
1
2
3

示例2:

链表:0-1-2, k=4

旋转后链表:2-0-1

s = Solution()
head = ListNode(0)
node1 = ListNode(1)
node2 = ListNode(2)
head.next = node1
node1.next = node2
k = 4
new_head = s.rotateRight(head, k)
while new_head:
    print(new_head.val)
    new_head = new_head.next

输出:

2
0
1

总结

本文详细介绍了 Python 实现旋转链表的方法,涉及到链表长度计算、链表反转、链表节点合并等知识点。同时给出了两个示例,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 数据结构之旋转链表 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构算法基础之循环队列示例

    标题:C语言数据结构算法基础之循环队列示例 1. 简介 循环队列是一种常见的数据结构,它采用固定大小的数组来模拟队列的数据结构,可以高效地处理队列的进出操作。本文将会讲解循环队列的实现原理和示例代码。 2. 循环队列基本原理 循环队列通过两个指针front和rear来实现队列的添加和删除操作。在初始化时,front和rear的初始值都为0。每当数据进入队列时…

    数据结构 2023年5月17日
    00
  • Java队列数据结构的实现

    下面是实现Java队列数据结构的完整攻略。 Java队列数据结构的实现 1. 概述 队列是一种常用的线性数据结构,是“先进先出”(FIFO)的一种数据结构。队列通常具有两个操作:入队和出队,它们分别对应着在队列尾添加元素和在队列头删除元素的操作。 在Java中,有多种方式可以实现队列数据结构,本文将讲解两种常用的实现方式:基于数组的实现和基于链表的实现。 2…

    数据结构 2023年5月17日
    00
  • golang中set数据结构的使用示例

    Golang中Set数据结构的使用示例 Set是一种无序的、元素不重复的数据结构。通过使用map来实现,map中的key即为Set中的元素,value则可以用来存储某种状态(比如计数)。 Set数据结构的定义 type Set struct { m map[interface{}]bool } Set数据结构的初始化 func NewSet() *Set {…

    数据结构 2023年5月17日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • 「学习笔记」BSGS

    「学习笔记」BSGS 点击查看目录 目录 「学习笔记」BSGS Baby-step Giant-step 问题 算法 例题 Discrete Logging 代码 P3306 [SDOI2013] 随机数生成器 思路 P2485 [SDOI2011]计算器 思路 Matrix 思路 代码 Baby-step Giant-step 问题 在 \(O(\sqrt…

    算法与数据结构 2023年4月17日
    00
  • 使用C语言构建基本的二叉树数据结构

    下面是使用C语言构建二叉树数据结构的步骤和示例: 1. 定义二叉树结构体类型 定义一个二叉树的结构体,包含节点值、左右子节点等信息: typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; 2. 实现创建二叉树的函数 实现一个函…

    数据结构 2023年5月17日
    00
  • C#数据结构之队列(Quene)实例详解

    C#数据结构之队列(Quene)实例详解 什么是队列? 队列是一种线性数据结构,只允许在队列的两端进行操作。队列是一种FIFO(First in First Out)的数据结构,即先进先出,类似于排队买票的场景。 C#中的队列(Quene) C#中队列(Quene)是System.Collections命名空间中的一个类,可以通过引入System.Colle…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部