Python实现环形链表

Python实现环形链表完整攻略

在Python中实现环形链表,可以使用节点嵌套的方式来表示链表。具体实现方式为,定义一个Node类,包含val和next属性,其中next属性指向下一个节点。为了实现环形链表,只需将最后一个节点的next属性指向头节点即可。

下面是在Python中实现环形链表的完整示例代码:

class Node():
    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next

class CircularLinkedList():
    def __init__(self):
        self.head = Node()
        self.head.next = self.head  # 将head节点的next属性指向自身

    def is_empty(self):
        return self.head.next == self.head

    def add(self, item):
        new_node = Node(item)
        new_node.next = self.head.next
        self.head.next = new_node

    def remove(self, item):
        cur_node = self.head
        while cur_node.next != self.head:
            if cur_node.next.val == item:
                cur_node.next = cur_node.next.next
                break
            cur_node = cur_node.next

    def search(self, item):
        cur_node = self.head
        while cur_node.next != self.head:
            if cur_node.next.val == item:
                return True
            cur_node = cur_node.next
        return False

    def __len__(self):
        length = 0
        cur_node = self.head
        while cur_node.next != self.head:
            length += 1
            cur_node = cur_node.next
        return length

    def append(self, item):
        new_node = Node(item)
        if self.is_empty():
            self.head.next = new_node
        else:
            cur_node = self.head
            while cur_node.next != self.head:
                cur_node = cur_node.next
            cur_node.next = new_node
        new_node.next = self.head

    def insert(self, pos, item):
        if pos <= 0:
            self.add(item)
        elif pos > len(self) - 1:
            self.append(item)
        else:
            new_node = Node(item)
            cur_node = self.head
            for i in range(pos):
                cur_node = cur_node.next
            new_node.next = cur_node.next
            cur_node.next = new_node

    def display(self):
        cur_node = self.head
        while cur_node.next != self.head:
            print(cur_node.next.val, end=' ')
            cur_node = cur_node.next
        print()

以上代码中,我们构建了一个CircularLinkedList类。其中,Node类表示一个链表节点,包含数值和指向下一个节点的next属性。CircularLinkedList类中定义了多种链表操作方法,包括判断链表是否为空、添加节点、删除节点、搜索节点等。

另外,我们通过判断cur_node.next是否等于self.head来确定是否到达了环形链表的末尾。

下面是一个简单的示例,演示如何创建一个环形链表,并对其进行插入、删除、遍历等操作:

# 示例1:创建环形链表并操作
cll = CircularLinkedList()

# 添加
cll.add(1)
cll.add(2)
cll.add(3)
cll.display()  # output: 3 2 1

# 删除
cll.remove(2)
cll.display()  # output: 3 1

# 遍历
cll.add(4)
cll.display()  # output: 4 3 1

# 插入
cll.insert(1, 5)
cll.display()  # output: 4 5 3 1

另外,我们可以套用Python自带的unittest模块,对线性链表的功能进行测试。下面是一个示例:

# 示例2:使用unittest测试
import unittest

class TestCircularLinkedList(unittest.TestCase):
    def test_append(self):
        cll = CircularLinkedList()
        cll.append(1)
        self.assertEqual(cll.is_empty(), False)
        self.assertEqual(len(cll), 1)

        cll.append(2)
        self.assertEqual(len(cll), 2)

        cll.append(3)
        self.assertEqual(len(cll), 3)

    def test_insert(self):
        cll = CircularLinkedList()
        cll.insert(0, 2)
        self.assertEqual(cll.is_empty(), False)
        self.assertEqual(len(cll), 1)

        cll.insert(0, 1)
        cll.insert(2, 3)
        cll.insert(1, 4)
        self.assertEqual(len(cll), 4)

    def test_remove(self):
        cll = CircularLinkedList()
        cll.remove(1)
        self.assertEqual(cll.is_empty(), True)
        self.assertEqual(len(cll), 0)

        cll.append(1)
        cll.append(2)
        cll.append(3)
        cll.remove(2)
        self.assertEqual(len(cll), 2)
        self.assertEqual(cll.search(2), False)

if __name__ == '__main__':
    unittest.main()

以上示例中,我们使用unittest模块,对线性链表的appendinsertremove方法进行了测试,并验证其是否符合预期。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现环形链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Coding.net简单使用指南

    Coding.net是一个面向开发者的云端协作平台,提供代码托管、项目管理、团队协作、CI/CD等功能。下面是Coding.net的简单使用指南。 注册账号 首先,需要在Coding.net上注册一个账号。注册过程非常简单,只需要提供邮箱地址和密码即可。 创建项目 注册成功后,可以创建一个新的项目。在Coding.net的首页上,单击“新建项目”按钮,填写项…

    other 2023年5月5日
    00
  • jQuery zTree搜索-关键字查询 递归无限层功能实现代码

    下面是对”jQuery zTree搜索-关键字查询 递归无限层功能实现代码”的详细讲解。 1. 前言 首先,需要说明的是,zTree是一款基于jQuery的树形组件,它简单易用、功能强大、性能高效。而本攻略主要介绍zTree中如何实现关键字搜索并递归无限层展开节点的功能。 2. 确认需求 在我们开始编写代码之前,需要先明确一下需求,即我们需要实现在zTree…

    other 2023年6月27日
    00
  • php+Ajax无刷新验证用户名操作实例详解

    PHP+Ajax无刷新验证用户名操作实例详解 在网站开发中,常常需要验证用户名是否可用,一般的做法是提交表单后在服务器端进行验证,再返回结果给前端页面。但这种方式会引起页面的刷新,体验不够友好。本文将介绍使用PHP+Ajax技术实现无刷新验证用户名的方法。 实现原理 使用Ajax技术,监听用户名文本框的键入事件,将文本框中的内容发送到服务器端进行验证。服务器…

    other 2023年6月27日
    00
  • 以撒的结合忏悔如何快速重启 一键大退与重启方法教学

    以撒的结合忏悔如何快速重启 介绍 以撒的结合是一款知名的roguelike游戏,常常需要进行重启操作。本文将介绍如何通过快速重启和一键大退的方法,节省游戏时间,增强游戏体验。 一键大退 首先,在游戏中按下 Ctrl+Alt+Delete 组合键,打开任务管理器。 在任务管理器中找到 以撒的结合 进程,并选中。 点击任务管理器中的 结束任务 按钮。 警告框弹出…

    other 2023年6月27日
    00
  • visualstudio字母怎么切换大小写? vs大写字母转换为小写的教程

    在Visual Studio中,你可以使用快捷键来切换字母的大小写。下面是一些常用的方法: 使用快捷键:你可以使用以下快捷键来切换选定文本的大小写: 将选定文本转换为大写:Ctrl + Shift + U 将选定文本转换为小写:Ctrl + U 使用上下文菜单:你也可以使用上下文菜单来切换字母的大小写。只需右键单击选定的文本,然后选择“转换为大写”或“转换为…

    other 2023年8月16日
    00
  • 第45章dcmi—ov2640摄像头—零死角玩转stm32-f429系列

    第45章dcmi—ov2640摄像头—零死角玩转stm32-f429系列 在这篇文章中,我将介绍如何在STM32-F429系列微控制器上使用DCMI-OV2640摄像头。我们将展示如何捕捉视频流和录制图像,并将它们显示在TFT显示屏上,以及使用DMA传输数据。最终,我们能够实现零死角观看实时视频。 硬件配置 要实现这个项目,我们需要以下硬件组件: STM32…

    其他 2023年3月28日
    00
  • free 或delete后指针怎么样了

    free或delete后指针怎么样了的完整攻略 在C++和C语言中,使用free或delete释放动态分配的内存是非常常见的操作。但是,释放内存后,指针会发生什么变化呢?本攻略将介绍free或delete后指针的变化,并提供两个示例说明。 free或delete后指针的变化 在使用free或delete释放动态分配的内存后,指针会变成一个野指针,即指向已经释…

    other 2023年5月6日
    00
  • cpu超线程知识 图文介绍什么是超线程

    CPU超线程知识:什么是超线程 简介 超线程是一种CPU技术,可以增加处理器的性能。该技术最初由英特尔公司在20世纪90年代开发,是英特尔超线程技术(HT Technology)的一部分。 超线程技术的基本思想是,在一个物理CPU核心上模拟多个逻辑处理器。通过这种方式,CPU可以同时执行多个线程,提高处理器的利用率,从而提高整个系统的性能。 原理 超线程技术…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部