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日

相关文章

  • antdpro路由

    antdpro路由 在 antdpro 中,路由是一个重要的功能,它用于控制网站页面的跳转和展示。本文将介绍 antdpro 中路由的基本使用和常见操作。 简介 在 antdpro 中,路由的配置文件是 config/router.config.js。这个文件中定义了整个网站的路由结构。路由采用了树形结构,可以通过 routes 属性进行配置。 一个简单的路…

    其他 2023年3月29日
    00
  • 被喷了!聊聊我开源的RPC框架那些事

    被喷了!聊聊我开源的RPC框架那些事 最近我开源了一款RPC框架,希望为开发者提供更好的解决方案。然而,我却被一些人喷了,原因主要是他们认为这款框架不够稳定,还存在一些问题。我深刻意识到这些问题,并认为需要向大家做出解释和回应。 关于框架稳定性问题 首先,我想说的是其实任何一款新的框架或者工具都会存在一些稳定性问题,这是不可避免的。正因为这样,我们才需要在社…

    其他 2023年3月28日
    00
  • Rails命令行常用操作命令简明总结

    Rails命令行常用操作命令简明总结 1. 创建一个新的Rails应用 要创建一个新的Rails应用,可以使用rails new命令。它会在当前目录下创建一个新的Rails应用。 rails new myapp 上述命令会创建一个名为myapp的新Rails应用。 2. 启动开发服务器 要启动Rails开发服务器,可以使用rails server命令。它会启…

    other 2023年6月28日
    00
  • pythonnp.mean()函数

    以下是关于“python np.mean()函数”的完整攻略,包含两个示例。 背景 在Python中,我们可以使用numpy库来进行科学计算。其中,np.mean函数是numpy库中的一个函数,用于计算数组或矩阵的平均值。那,在Python中,我们应如何使用np.mean()函数呢? 使用方法 在Python中,我们可以使用np.mean()函数来计算数组或…

    other 2023年5月9日
    00
  • Ubuntu中类似QQ截图的截图工具并实现鼠标右键菜单截图

    下面是关于在Ubuntu中使用类似QQ截图的截图工具并实现鼠标右键菜单截图的完整攻略,包括安装、配置和两个示例说明。 安装 在Ubuntu中,可以使用以下命令安装类似QQ截图的截图工具: sudo apt-get install flameshot 安装完成后,可以在应用程序菜单中找到Flameshot截图工具。 配置 为了实现鼠标右键菜单截图,需要进行以下…

    other 2023年5月6日
    00
  • Win10系统键盘大小写切换键(Caps Lock)失灵的故障分析及解决方法

    Win10系统键盘大小写切换键(Caps Lock)失灵的故障分析及解决方法攻略 故障分析 当Win10系统键盘的大小写切换键(Caps Lock)失灵时,可能有以下几个原因: 软件设置问题:可能是由于系统设置或第三方软件的设置问题导致Caps Lock键无法正常工作。 驱动问题:可能是键盘驱动程序出现故障或需要更新,导致Caps Lock键无法正常切换大小…

    other 2023年8月16日
    00
  • C语言中的奇技淫巧

    C语言中的奇技淫巧攻略 简述 C语言中的奇技淫巧是指一些高效且极具创意的编程方式,用来解决特定的问题或者优化程序。这些技巧并不是常用的语言特性,因此有时候会显得神秘和高深。本攻略将为您介绍几个C语言中常见的奇技淫巧,包括但不限于代码精简、微优化、编译器选项、调试技巧等。 代码精简 代码精简是提高程序执行效率的一种方式,其核心思想是“合理使用空间和时间”。以下…

    other 2023年6月27日
    00
  • 深入探究Java原型模式的魅力

    深入探究Java原型模式的魅力 什么是原型模式? 原型模式是一种通过克隆来创建对象的设计模式。在使用原型模式时,需要先创建一个原型对象,然后通过复制该原型对象来创建新的对象。这种方式可以避免重复创建相似的对象,可以提高程序的性能和可维护性。 原型模式的使用场景 原型模式适用于以下场景: 需要创建对象的时间和代价比较大,例如创建数据库连接或者网络连接; 需要在…

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