首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何创建一个哑头双循环链表python?

哑头双循环链表是一种特殊的链表数据结构,它在普通双循环链表的基础上添加了一个哑头节点,用于简化链表操作。下面是创建一个哑头双循环链表的Python代码示例:

代码语言:txt
复制
class Node:
    def __init__(self, data=None):
        self.data = data
        self.prev = None
        self.next = None

class DummyHeadDoubleLinkedList:
    def __init__(self):
        self.dummy_head = Node()  # 哑头节点
        self.dummy_head.prev = self.dummy_head
        self.dummy_head.next = self.dummy_head

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

    def add_node(self, data):
        new_node = Node(data)
        new_node.prev = self.dummy_head
        new_node.next = self.dummy_head.next
        self.dummy_head.next.prev = new_node
        self.dummy_head.next = new_node

    def remove_node(self, data):
        current = self.dummy_head.next
        while current != self.dummy_head:
            if current.data == data:
                current.prev.next = current.next
                current.next.prev = current.prev
                return
            current = current.next

    def print_list(self):
        current = self.dummy_head.next
        while current != self.dummy_head:
            print(current.data, end=" ")
            current = current.next
        print()

# 创建一个哑头双循环链表
dll = DummyHeadDoubleLinkedList()
dll.add_node(1)
dll.add_node(2)
dll.add_node(3)

# 打印链表
dll.print_list()  # 输出: 1 2 3

# 删除节点
dll.remove_node(2)

# 打印链表
dll.print_list()  # 输出: 1 3

这段代码实现了一个哑头双循环链表的基本功能,包括判断链表是否为空、向链表中添加节点、从链表中删除节点以及打印链表内容。你可以根据需要进行扩展和修改。

关于云计算、IT互联网领域的名词词汇,可以参考腾讯云的官方文档和产品介绍页面,其中包含了丰富的云计算相关概念、分类、优势、应用场景以及推荐的腾讯云产品。具体链接地址请参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python创建一个链表

1 问题 创建链表过程中的过程可以简述为:如果发现指针指向NULL,也就是链表此时为空,没有一个结点,那就让指针指向这个结点;如果发现指针已经指向一个结点了,即链表不为空,那么就通过遍历找到最后那个结点...,让最后那个结点指向新创建的那个结点,也就是每次新创建的结点都在最后。...2 方法 1.声明一个指针(如果有必要,可以声明一个节点); 2.创建多个存储数据的节点,在创建的过程中,要随时与其前驱节点建立逻辑关系。...,它是用来存储数据的,举一个很形象的例子,就比如说以前玩的那个贪吃蛇,就是链表一个很好的应用。...在玩贪吃蛇的时候,食物就相当于一个新的结点,而在链表中,有很多对链表的操作,比如说:插,尾插,排序插,中间插等等你可以想象成,将贪吃蛇吃到的食物是放在,,尾,或者中间,或者按颜色的顺序进行排列,其实链表不难

6710

【力扣算法07】之 2.两数相加 python

然后,创建一个结点(dummy)作为结果链表节点,并创建一个当前节点指针(curr)用于逐个链接新的节点。 接下来,需要考虑进位问题。...dummy的结点,用于表示结果链表节点。...然后,创建新的节点,并将其链接到当前节点的下一个,将当前节点指针后移一位,指向新创建的节点。最后,如果链表还未遍历完,将当前节点指针后移一位。...l2: # 如果l2为空链表,返回l1 return l1 dummy = ListNode(0) # 创建一个值为0的结点,用于表示结果链表节点...如果其中一个链表为空,直接返回另一个链表作为结果。 dummy = ListNode(0):创建一个值为0的结点,用于表示结果链表节点。

8010

链表

(有时第一个节点并不存储数据,仅仅作为来使用) 指针,尾指针 指针指向节点,尾指针指向尾节点_指针是找到链表的关键(详细见图1) 图1: ?...创建一个链表 以图1中的情况2为例编写代码 思路: 首先, 定义一个结构体用来存储节点的相关信息(数据域,指针域) 然后,在创建一个节点(不存任何数据_节点),之后在节点后面不断添加节点 开始代码实现...struct node* pnext; // 指针域 }; // 给结构体类型取别名 typedef struct node Node; // **创建一个链表并且给初始值 // 参数: 长度...// 数据域 struct node* pnext; // 指针域 }; // 给结构体类型取别名 typedef struct node Node; // **创建一个链表并且给初始值...define _CRT_SECURE_NO_WARNINGS 1 // 解决VS2019 scanf不安全报错问题 #include "myList.h" #include #include // **创建一个链表并且给初始值

59160

一般是面试的热身题——LeetCode题目21:合并两个有序链表

原题描述 + 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。...现在回到这道题目,思路很简单: 先创建一个结点(结点),它将指向合并的新链表; 使用两个指针指向两个链表表头,不断相互比较,每次取较小的节点进行合并,然后对应的指针后移,不断重复这个过程; 大概率有一个链表先遍历完...,这种情况直接把未遍历完的剩余链表节点直接合并即可。...我想提几个点: 题目是合并已有的链表,千万千万别自己创造新的链表; 遇到链表的题目请优先考虑创建结点,这很方便。...初始声明结点(结点) ? 2. 比较p和q指向的值,优先连接值较小的节点; ? 3. 将上述刚刚被连接的节点指针后移一步,继续比较,连接,直到某个链表被完全遍历; ?

49210

数据结构 | 每日一练(23)

循环单链表的最大优点是:________。 2. 已知指针 p 指向单链表 L 中的某结点,则删除其后继结点的语句是:________。 3....带头结点的双循环链表 L 中只有一个元素结点的条件是:________。 4. 在单链表 L 中,指针 p 所指结点有后继结点的条件是:__ 。...5.带头结点的双循环链表 L 为空表的条件是:________。 6. 在单链表 p 结点之后插入 s 结点的操作是:_______。 7.请在下列算法的横线上填入适当的语句。...FUNCTION inclusion(ha,hb:linklisttp):boolean; {以 ha 和 hb 为指针的单链表分别表示有序表 A 和 B,本算法判别表 A 是否包含在表 B 内,若是...) ; WHILE(2) DO IF pa^.data=pb^.data THEN(3) ELSE(4) ; (5) END; 正确答案 1.从任一结点出发都可访问到链表中每一个元素

1.1K3229

链表——19. 删除链表的倒数第 N 个结点

1 题目描述 删除链表的倒数第 N 个结点. 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表结点。...sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz 4 思路 前言 在对链表进行操作时,一种常用的技巧是添加一个节点(dummy node),它的...\textit{next}next 指针指向链表节点。...但由于节点不存在前驱节点,因此我们需要在删除节点时进行特殊判断。但如果我们添加了节点,那么节点的前驱节点就是节点本身,此时我们就只需要考虑通用的情况即可。...为了与题目中的 nn 保持一致,节点的编号从 11 开始,节点为编号 11 的节点。 为了方便删除操作,我们可以从节点开始遍历 L-n+1L−n+1 个节点。

22620

Leetcode No.147 对链表进行插入排序

一、题目描述 对链表进行插入排序。 给定单链表指针,使用插入排序对链表进行排序,然后返回已排序链表指针。 从第一个元素开始,该链表可以被认为已经部分排序。...对于单向链表而言,只有指向后一个节点的指针,因此需要从链表节点开始往后遍历链表中的节点,寻找插入位置。 对链表进行插入排序的具体过程如下。 1....首先判断给定的链表是否为空,若为空,则不需要进行排序,直接返回。 2. 创建节点 dummyHead,令 dummyHead.next = head。...引入节点是为了便于在 head 节点之前插入节点。 3. 维护 lastSorted 为链表的已排序部分的最后一个节点,初始时 lastSorted = head。 4....否则,从链表节点开始往后遍历链表中的节点,寻找插入 curr 的位置。

28120

如何Python 中使用 Matplotlib 创建一个空的 Figure?

Matplotlib是一个功能强大的Python库,用于数据可视化和创建2D绘图。它提供了用于创建静态、动画和交互式图的各种工具,包括线图、散点图、条形图、直方图等。...Matplotlib 是高度可定制的,允许用户调整颜色、字体和其他视觉元素来创建高质量的可视化效果。 它广泛用于数据科学、工程和科学研究,被认为是 Python 最受欢迎的数据可视化库之一。...的默认内联后端在 Python 中使用 Matplotlib 创建一个空图形。...这种学习对于那些使用matplotlib或Python中的任何其他可视化库创建图形和绘图的初学者非常有帮助。...输出 我们学习了如何使用Jupyter notebook的ipympl后端在Python中使用Matplotlib创建一个空图形。这使我们能够在Jupyter笔记本中创建交互式图形。

26120

【程序员必看】如何Python创建一个区块链?

IT派 - {技术青年圈} 持续关注互联网、区块链、人工智能领域 小编认为最快的学习区块链的方式是自己创建一个,本文就用Python创建一个区块链。...通过构建一个区块链可以加深对区块链的理解。 准备工作 本文要求读者对Python有基本的理解,能读写基本的Python,并且需要对HTTP请求有基本的了解。...Blockchain类 首先创建一个Blockchain类,在构造函数中创建了两个列表,一个用于储存区块链,一个用于储存交易。...我们将创建三个接口: /transactions/new 创建一个交易并添加到区块 /mine 告诉服务器去挖掘新的区块 /chain 返回整个区块链 创建节点 我们的“Flask服务器”将扮演区块链网络中的一个节点...第18行: 为节点创建一个随机的名字. 第21行: 实例Blockchain类. 第24–26行: 创建/mine GET接口。

84870

如何Python 从 0 开始创建一个区块链?

开始创建Blockchain 新建一个文件 blockchain.py,本文所有的代码都写在这一个文件中,可以随时参考源代码。...Blockchain类 首先创建一个Blockchain类,在构造函数中创建了两个列表,一个用于储存区块链,一个用于储存交易。...创建新块 当Blockchain实例化后,我们需要构造一个创世块(没有前区块的第一个区块),并且给它加上一个工作量证明。 每个区块都需要经过工作量证明,俗称挖矿,稍后会继续讲解。...我们将创建三个接口: /transactions/new 创建一个交易并添加到区块; /mine 告诉服务器去挖掘新的区块; /chain 返回整个区块链。...; 第18行:为节点创建一个随机的名字; 第21行:实例Blockchain类; 第24–26行:创建/mine GET接口; 第28–30行:创建/transactions/new POST接口,可以给接口发送交易数据

1.9K60

分隔链表

ListNode large = new ListNode(0); ListNode small = new ListNode(0); // 为两个新建的链表分别设置节点...,则说明遍历结束,将储存比特定值大的链表的末尾指针指向 null large.next = null; // 将储存比特定值小的链表的末尾指针指向储存比特定值大的链表节点...} } 题解分析   这道题的思路是原链表拆成两个新的链表再合起来,一个储存比特定值小的,一个储存比特定值大的。...首先定义两个的链表 small 和 large,同时再定义两个结点,用于更方便地处理头节点为空的边界条件。...当传进来的链表头节点不为空则进入循环,遍历整个链表,判断每一个值与特定值的关系,当头节点的值小于特定值时,将其拼接到 small 链表中;当头节点的值大于或等于特定值时,将其拼接到 large 链表中,

31030

关于「反转链表」,看这一篇就够了!

面试官很可能不希望看到你的各种“奇技淫巧”: 加入结点(即额外的链表头结点)可以简化插入操作,但面试官通常会要求你不要创建额外的链表结点,结点显然也属于额外的结点。...使用 C/C++ 的二级指针可以让删除结点的代码非常精简,但如果面试官对此不熟悉的话,会看得一雾水。 那么,如何才能简洁明了地解决单链表问题呢?...使用两个指针让删除结点非常容易:已删除 下面,我们看一看如何用这个链表遍历的框架来解决本期的例题:反转链表。...本期例题:反转链表的解法 反转链表的题目会有一个隐藏的要求:不能创建新的链表结点,只是在原有结点上修改链表指针。这样的原地操作会比生成一个新的链表要难很多。 ?...当前结点为结点时,前一半链表为空 ?

1K21

【数据结构】线性表 ⑥ ( 双循环链表 | 双循环链表插入操作 | 双循环链表删除操作 | LinkedList 双循环链表源码分析 )

一、双循环链表插入操作处理 双循环链表 中 , 需要对 插入 / 删除 / 遍历 操作 进行特殊处理 , 因为需要调节 前驱指针 和 后继指针 两个指针 ; 如 : 双循环链表 中 , 如果要插入元素...---- 下面的链表插入成功 , 顺序为 a , c , b , 如果要删除双循环链表中的 c 元素 , 只需要将 a 元素的 后继指针 指向 b , 将 b 元素的 前驱指针 指向 a 即可 ;.../9.0.0_r8/xref/libcore/ojluni/src/main/java/java/util/LinkedList.java 1、链表节点 LinkedList 链表一个 双循环链表 ,...*/ void linkLast(E e) { // 先保存尾结点的指针 final Node l = last; // 创建一个新节点 , 将数据插入到新节点中..., 该节点是插入的第一个节点 first = newNode; else // 链表不为空 , 该节点是插入的除第一个节点之外的后续节点

22620
领券