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日

相关文章

  • Access保留字&变量名列表

    Access保留字 & 变量名列表攻略 在Microsoft Access中,保留字是一些被系统保留的关键词,用于表示特定的操作或功能。这些保留字不能用作变量名或对象名称,否则会导致语法错误。同时,Access还有一些命名规则和限制,用于定义变量名和对象名称的有效性。下面是关于Access保留字和变量名列表的详细攻略。 Access保留字 以下是一些…

    other 2023年8月8日
    00
  • Redis教程(十四):内存优化介绍

    Redis教程(十四):内存优化介绍 1. 介绍 在Redis中,内存是一个非常重要的资源。合理地使用和优化内存可以提高Redis的性能和稳定性。本教程将详细介绍Redis的内存优化技巧和策略。 2. 内存优化技巧 2.1 使用压缩列表 Redis中的列表和哈希表都可以使用压缩列表来节省内存。压缩列表是一种紧凑的数据结构,可以在一定程度上减少内存占用。下面是…

    other 2023年8月2日
    00
  • Java多线程之彻底搞懂线程池

    Java多线程之彻底搞懂线程池 什么是线程池 线程池是一种线程管理技术,它包括一些线程,等待着需要执行的任务。当一个任务到来时,得到一个线程池中的空闲线程来处理该任务,这些线程被称为工作线程。当任务执行完毕,工作线程并不会被销毁,而是被放回线程池中等待下一个任务的到来。 Java中的线程池 Java提供了一个线程池框架——java.util.concurre…

    other 2023年6月27日
    00
  • Python性能调优的十个小技巧总结

    Python性能调优的十个小技巧总结 在Python编程中,性能调优是一个重要的方面,可以提高程序的执行效率和响应速度。下面是十个小技巧,可以帮助你优化Python代码的性能。 1. 使用局部变量 在循环或函数中,尽量使用局部变量而不是全局变量。因为局部变量的访问速度更快,可以减少函数调用和内存访问的开销。 示例: def calculate_sum(num…

    other 2023年7月29日
    00
  • php开源项目大全

    PHP开源项目大全 PHP开源项目有很多,下面列出了一些我认为值得关注的项目。这些项目可以做到从前端的UI到后端的数据库、缓存等都是完整的,可以帮助开发者快速开发自己的项目,提高工作效率。这些项目都是在GitHub上开源的,大家可以自由的下载、学习、使用、修改、分享。下面是具体的项目列表: 1. Laravel Laravel是一套简洁、优雅的PHP Web…

    其他 2023年3月29日
    00
  • 图片溢出div问题的快速解决方法推荐

    以下是关于“图片溢出div问题的快速解决方法推荐”的完整攻略: 1. 问题描述 当图片的大小大于div的尺寸时,图片将会溢出div,影响页面的美观和用户的体验。 2. 快速解决方法 2.1 方法一:overflow属性 使用CSS的overflow属性,将div设为隐藏溢出部分,即可快速解决问题。 div { overflow: hidden; } 示例: …

    other 2023年6月26日
    00
  • jQuery实现图片预加载效果

    下面是jQuery实现图片预加载效果的完整攻略: 准备工作 首先,需要在HTML文件中引入jQuery库。可以使用CDN方式引入,也可以将jQuery库下载至本地进行引用。具体操作方式如下: <!– CDN引入方式 –> <script src="https://cdn.bootcdn.net/ajax/libs/jquery…

    other 2023年6月25日
    00
  • MSN帐号格式以及MSN用户名格式的详细介绍

    MSN帐号格式以及MSN用户名格式的详细介绍 MSN帐号格式 MSN帐号是指用于登录MSN网络服务的帐号,其格式为:帐号名称@网址后缀。其中,帐号名称可以是任意字符,必须包含字母和数字,长度不超过64个字符;网址后缀必须为hotmail.com、live.com或outlook.com中的一种。 下面是两个MSN帐号格式的例子: john_doe_123@o…

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