数据结构与算法-链表之双向链表

《恋上数据结构与算法》第1季:双向链表实现(超详细笔记,图文并茂) 之前我们所学的链表也叫做单向链表,单向链表的其中一个不好之处就是 无论添加,删除,查询,修改等操作,都需要从头结点开始依次查询要操作的节点。因此,为了解决这一问题,我们就需要使用双向链表,使用双向链表可以提升链表的综合性能。 阅读详情

双向链表

一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

实现:

class Node(object):
    """节点"""
    def __init__(self, elem):
        self.elem = elem
        self.prev = None
        self.next = None

class SingleLinkList(object):
    """单向链表"""
    def __init__(self, node=None):
        self.__head = node

    def is_empty(self):
        return self.__head == None

    def length(self):
        """链表长度"""
        cur = self.__head
        count = 0
        while cur != None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.__head
        while cur != None:
            print(cur.elem, end=" ")
            cur = cur.next
        print("")

    def add(self, item):
        """链表头部添加元素"""
        node = Node(item)
        node.next = self.__head
        self.__head = node
        node.next.prev = node # 也可以等于self.head

    def append(self, item):
        """链表尾部添加元素"""
        node = Node(item)
        if self.is_empty():
            self.__head = node
        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            cur.next = node
            node.prev = cur

    def insert(self, pos, item):
        """
        指定位置添加元素
        :param pos: pos 从哪里开始
        :param item:
        :return:
        """
        if pos <= 0:
            self.add(item)
        elif pos > (self.length()-1):
            self.append(item)
        else:
            cur = self.__head
            count = 0
            while count < (pos-1):
                count += 1
                cur = cur.next

            # 当循环退出后,cur指向pos-1的位置
            node = Node(item)
            node.next = cur
            node.prev = cur.prev
            cur.prev.next = node
            cur.prev = node


    def remove(self, item):
        """删除节点"""
        cur = self.__head
        while cur != None:
            if cur.elem == item:
                # 判断是否为头节点
                if cur == self.__head:
                    self.__head = cur.next
                    if cur.next:
                        cur.next.prev = None
                else:
                    cur.prev.next = cur.next #
                    if cur.next:
                        cur.next.prev = cur.prev
                break
            else:
                cur =cur.next

    def search(self, item):
        cur = self.__head
        while cur != None:
            if cur.elem == item:
                return True
            else:
                cur = cur.next
        return False

if __name__ == '__main__':
    ll = SingleLinkList()
    # print(ll.is_empty())
    # print(ll.length())

    ll.append(1)
    print(ll.is_empty())
    print(ll.length())
    ll.append(2)
    ll.add(8)
    ll.append(3)
    ll.append(4)
    ll.append(5)
    ll.append(6)

    ll.travel()
    ll.insert(-1, 9)  # 9 8 1 23456
    ll.travel()
    ll.insert(3, 100)  # 9 8 1 100 2 3456
    ll.travel()
    ll.insert(10, 200)  # 9 8 1 100 23456 200
    ll.travel()
    ll.remove(100)
    ll.travel()
    ll.remove(9)
    ll.travel()
    ll.remove(200)
    ll.travel()
    print(ll.search(77))

 

数据结构与算法 — 初识双向链表、双向链表的常见操作及实现 目录 一、初识双向链表 二、双向链表的封装 三、双向链表的常见操作及实现 1.双向链表中常见的操作 2.append()方法 3.toString()方法、forwardtoString()方法、backwardtoString()方法 4.insert()方法 5.get()方法 6.indexOf()方法 7.update()方法 8.removeAt()方法 9.remove()方法 10.isEmpty()方法 11.size(... 阅读详情

相关推荐

Python数据结构与算法(2.4)——双向链表

双向链表与单链表相似,属于顺序表的链式存储结构,单链表和双向链表的唯一区别在于双向链表是用两个指针表示结点间的逻辑关系,增加了一个指向其直接前驱的指针域,这样形成的链表有两条不同方向的链——前驱链和后继链,因此称为双向链表,或称为双链表。本节中我们将重点讨论双向链表及其相关操作的实现。

盼小辉丶的博客 3万+

数据结构与算法——双向链表

前言     为了面试,时隔一年不得不重新复习数据结构与算法,这次重新复习很有收获,以前在上课总有不清晰的知识,通过这次手写一遍和敲一遍代码,以前不清晰的知识都变得清晰了,果然学编程还是得多敲代码,多敲代码,多敲代码,也要多总结,多总结,多总结。 学习资源 视频 黑马程序员  数据结构与算法 双向链表     双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点

qq_45767014的博客 364

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

【数据结构与算法】详解什么是双向链表,并用代码手动实现一个双向链表

上一篇文章讲解了链表的相关知识,并用代码实现了一个链表结构。那么本文将介绍一下另一种特殊的链表结构,叫做 双向链表。 顾名思义,普通的链表都是从 head 开始往后遍历结构内的元素,那么双向链表就是既可以从头开始遍历,又可以从结构的末尾开始遍历。 上一篇文章的跳转链接—— 本文就来详细讲解一下双向链表的概念以及如何实现一个双向链表。 公众号:Lpyexplore的编程小屋 关注我,每天更新,带你在python爬虫的过程中学习前端,还有更多电子书和面试题等你来拿 数据结构——双向链表一、什么是双向链表二

零一的博客 2万+

单细胞实战之亚细胞分群从T/NK至CD4+T细胞——从入门到进阶(中级篇1)

亚细胞分群从T/NK至CD4+T细胞

zfyyzhys的博客 6392

抖音短视频数据抓取实战系列(一)——模拟器性能对比与优化配置

本文是抖音短视频数据抓取实战系列的开篇,重点探讨了模拟器选型与优化配置。通过对比雷电、夜神、逍遥三大主流模拟器在性能、抖音兼容性及抓包友好度上的表现,文章指出雷电模拟器因其稳定的桥接网络模式和良好的兼容性,是数据抓取的优选。并提供了雷电模拟器从安装、网络桥接到系统优化的详细配置指南,旨在帮助读者构建稳定高效的抓取环境。

weixin_29230901的博客 248

【数据结构与算法】—— * 双向链表 *

【数据结构与算法】—— * 双向链表 * 多图详解

forever_bryant的博客 1371

【Python】秋招机考 —— 2025/8/27 华为 AI 方向

2025 华为 AI 秋招机考题目包含15道单选题、5道多选题和2道机器学习编程题,涵盖核心算法与数学知识。单选题考察了Softmax激活、Transformer位置编码、Jacobi迭代、大模型幻觉现象、特征向量、K-means聚类、矩阵秩、实对称矩阵性质、SVD分解、概率论等知识点。多选题涉及高斯-赛德尔迭代和朴素贝叶斯分类器。

一杯水果茶!足矣~ 842

【数据结构与算法】双向链表

本文详细介绍了双向链表的分类与实现。链表可分为8种组合类型,但实际最常用的是单链表和带头双向循环链表。双向链表由包含前驱/后继指针的节点组成,空表时仅含头节点。文章重点讲解了双向链表的核心操作实现: 尾插:在尾部插入新节点,需调整原尾节点和头节点的指针 头插:在头节点后插入新节点,需处理空表情况 删除操作:尾删和头删都需注意防止野指针 查找:遍历链表直至找到目标数据 指定位置操作:在pos位置后插入数据或删除pos节点,需谨慎调整前后节点的指针关系 每个操作都配有代码示例和图示说明,强调指针操作的顺序重要性

2601_95685024的博客 616

在PPT里如何做出晶莹剔透的高级水泡感出来呢

水晶汽泡被大量使用在TED场景的演讲片稿中,给人以强烈的视觉冲击感。其实实现很简单。本篇就用三步教会大家如何制作这样的一种PPT效果。

打造全国最全的AI Agent开发知识领域的博客 1537

WPF中使用TreeView封装组合控件TreeView+DataGrid

wpf的功能非常强大,很多控件都是原生的,但是要使用TreeView+DataGrid的组合,就需要我们自己去封装实现。功能如上图所示, 目前基本上把常用的样式都实现了,购买源码后,可以自行修改样式。本文源码效果如下,(搞了好几天,的确有难度,所以源码也收费,便宜,赚点辛苦费)第一种:技术的选择是TreeView(也就是本文的演示)。这2个图都是第三方控件自带的,并且都是收费使用。首先说明一下,实现上面的效果,有3种方法。本文演示的是使用TreeView的实现。第二种:技术的选择是DataGrid。

故里2130 1650

【数据结构与算法】 - 双向链表 - 详细实现思路及代码

介绍双向链表,以及双向链表的详细实现步骤,最后提供了C语言实现双向链表的代码

wkd_007的博客 1万+

Android性能优化之Android Profiler

在移动应用开发中,打造一个流畅、省电且不卡顿的用户体验是至关重要的。然而,随着应用功能的日益复杂,内存泄漏、CPU暴涨、网络卡顿以及电量消耗过快等问题常常化身为隐形杀手,悄悄吞噬着用户体验。为了帮助开发者精准定位并解决这些性能瓶颈,谷歌在Android Studio中集成了一款强大的一站式性能分析工具Android Profiler。Android Profiler作为Android Studio内置的实时数据可视化工具,支持运行在Android 5.0及更高版本的设备上。

xiangzhihong8的专栏 202

数据结构与算法3-双向链表

在上一篇文章中,我们已经了解了单链表的实现。单链表中的每个节点只有一个指向下一个节点的指针。而双向链表则在每个节点中增加了一个指向前一个节点的指针,使得我们可以从任一节点开始向前或向后遍历整个链表。这种结构在某些情况下可以提高操作的效率。

weixin_54481049的博客 478

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。 选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。 点击黑色小圆点,小圆点变绿,表示打断点成功。 此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。 点击编译,成功会弹出窗口显示编译成功,失败会在下方报错error,并显示错误的原因。 点击应用保存,选择yes to all就可以了。 点击用例执行就可以看到打断点情况下的执行结果了。

weixin_59334478的博客 2077

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构与算法入门_双向链表

之前的文章我们讲解了顺序表和单链表,这篇我们来一起研究一下双向链表作为链表的收尾双向链表也是一种链式数据结构,每个节点包含两个指针:前驱指针:指向当前节点的前一个节点后继指针:指向当前节点的后一个节点相比于单向链表,双向链表支持双向遍历,删除指定节点更高效,插入操作更灵活。但也有自己的缺点。每个节点多消耗一个指针的存储空间,操作逻辑更复杂,需同时维护两个指针。

ming_0128的博客 314

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数据结构与算法之双向链表

前言 前文介绍了单向链表,相信大家也了解单向链表是一个怎样的数据结构,除了单向链表,链表还有双向链表。 从名字也可以看出来,双向链表就是不止于从前(头部)向后(尾部)寻址,还可以从后向前寻址,显而易见的是,这样的数据结构,在某些场景,比如从尾部插入,删除等,比单向链表更有效率,相应的,由于每一个结点中存储了两个结点的地址,所以,双向链表比单向链表需要更大的空间,其实,这便是数据结构中空间换时间的思...

csdn_1364491554的博客 500

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构与算法 双向链表

【代码】数据结构与算法 双向链表。

2501_91473619的博客 116

数据结构与算法:双向链表

单链表中,一个节点存储数据和指向下一个节点的指针,而双向链表除了上述两个内容,还包括了指向上一个节点的指针带头的双向链表,是指在双向链表的最前端添加了一个额外的节点,这个节点被称为头节点(哨兵节点),但它一般不用于存储实际的数据(或者可以说存储的数据不被使用)。头节点的主要目的是为了简化链表操作的逻辑,避免在处理链表的开始和结束位置时需要进行特殊的条件判断。在没有头节点的普通双向链表中,如果链表为空,则链表的第一个节点(head pointer)直接为NULL,

Quietcoder的博客 1424

数据结构与算法 — 双向链表

双向链表定义 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 双向链表与单链表 单向链表优缺点: 1、优点:单向链表增加删除节点简单。遍历时候不会死循环; 2、缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。 双向链表优缺点: 1、优点:可以找到前驱和后继,可进可退; 2、缺点:增加节点和删除节点复杂,多需要分配一个指针存储空间。 代码实现与思路 1.定义结点

我会二进制 793

数据结构与算法-双向链表

总之,双向链表作为一个既有单链表的动态特性又增加了双向访问能力的数据结构,其在实际应用中扮演着举足轻重的角色。通过对双向链表的深入理解和熟练运用,开发者能够更好地优化算法性能,提高程序设计的灵活性和效率。

m0_62988332的博客 1823

数据结构与算法—双向链表

详细讲解了数据结构中—双向链表的实现。

Han同学 992

Java 中的数据结构和算法,第 5 部分:双向链表

使用双向链表和循环链表及其算法进行高级搜索和排序

ITnababy的博客 292

Java实现数据结构与算法-链表与双向链表

刚刚走上工作岗位,准备复习一下之前学过的数据结构和算法,把在北邮和国大学过的知识梳理一下,想想之前并没有用Java实现过数据结构和算法,之前只用的C。之后工作大部分就与Java打交道了,而且还会接触云计算还有数据挖掘什么的。所以,在这里献一下丑,用Java实现一些基本的和复杂的数据结构还有算法,希望大家多多指正啦! 1.链表: 我的理解,链表相较于普通数组的优势主要在于插入和删除一个节点比较快

zhxhash的博客 753
上一篇: 数据结构与算法-链表之单向循环链表
下一篇: 数据结构与算法-树与树的算法开篇
LELELED
博客等级 码龄9年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值