python双向链表 du_Python的双向链表实现

思路

链表由节点组成,先规定节点(Node),包含data和指向下个节点的next

初始化

data当然就是传入的data了,next和prev指向None

添加

分两种情况:

链表为空,那么头节点和尾节点都指向新插入的节点

链表不为空,那么直接在尾部添加即可

遍历

因为只有链表的尾节点的next是指向None的,所以可以根据这点来从头遍历

删除某个节点

删除的时候分4种情况:

链表为空的时候

头节点,此时更改头节点的prev

尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可

中间的节点,修改要删除的节点的前驱和后继节点的next和prev指向就好

搜寻

遍历查找即可

清空链表

将头节点和尾节点都置为None即可

class Node:

def __init__(self,data=None, next=None, prev=None):

self.next = next

self.prev = prev

self.data = data

class DoublyLinkedList:

def __init__(self):

self.head = None

self.tail = None

self.size = 0

def append(self,data):

'''添加元素'''

node = Node(data,None,None)

if self.head is None:

self.head = node

self.tail = self.head

else:

node.prev = self.tail

self.tail.next = node

self.tail = node

self.size += 1

def iter(self):

'''遍历链表'''

current = self.head

while current:

value = current.data

current = current.next

yield value

def delete(self,data):

'''根据数据删除节点'''

current = self.head

node_deleted = False

if current is None:#链表为空

node_deleted = False

elif current.data == data:#要删除的元素在链表的开头

self.head.prev = None

self.head = current.next

node_deleted = True

elif self.tail.data == data:#要删除的元素在链表的结尾

self.tail = self.tail.prev

self.tail.next = None

node_deleted = True

else:#要删除的元素在链表中间的某一处

while current:

if current.data == data:

current.prev.next = current.next

current.next.prev = current.prev

node_deleted = True

current = current.next

if node_deleted:#如果有元素被删除,长度就减一

self.size -= 1

def contain(self,data):

'''搜寻某个节点'''

for node in self.iter():

if data == node:

return True

return False

def clear(self):

'''清空链表'''

self.tail = None

self.head = None

(转)Python 实现双向链表(图解)

原文:https://blog.csdn.net/qq490691606/article/details/49948263 Python 实现双向链表(图解)双向链表双向链表也叫双链表,是链表的一种, ...

Python 实现双向链表(图解)

原文:https://blog.csdn.net/qq490691606/article/details/49948263 git 路径 https://github.com/wangpanjun/d ...

python实现双向链表的操作

双向链表 双向链表又叫做双链表,每个节点有两个指针域和一个数据域.prev指针域指向前一个节点,next指针域指向下一个节点.注意,第一个节点的prev指针域指向空值,最后一个节点的next域也是指向 ...

python实现双向链表

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

Python数据结构--双向链表

''' 双向链表包含第一个和最后一个的链接元素. 每个链接都有一个数据字段和两个称为next和prev的链接字段. 每个链接都使用其下一个链接与其下一个链接链接. 每个链接都使用其上一个链接与之前的链 ...

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

# coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # ...

python 数据结构之双向链表的实现

和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/usr/bin/python # -*- coding: utf-8 -*- class Nod ...

Python链表的实现与使用(单向链表与双向链表)

参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

用Python写单向链表和双向链表

链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

随机推荐

项目管理_FindBugs的使用

本章将讲述如何在Myeclipse下,使用FindBugs,静态分析工具,无需开发人员费劲就能找出代码中已有的缺陷. 一:Myeclipse下如何安装FindBugs插件 1:FindBugs插件下载 ...

SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数

SQLSERVER中的ALL.PERCENT.CUBE关键字.ROLLUP关键字和GROUPING函数 先来创建一个测试表 USE [tempdb] GO )) GO INSERT INTO [#te ...

Cesium原理篇:6 Render模块(4: FBO)

Cesium不仅仅提供了FBO,也就是Framebuffer类,而且整个渲染过程都是在FBO中进行的.FBO,中文就是帧缓冲区,通常都属于高级用法,但其实,如果你了解了它的基本原理后,用起来还是很简单 ...

C/C++ 如何来自动优雅的涮别银家的贴子

被涮屏涮烦了,就分享一下如何用低调的c/c++来涮别人家的屏吧! 此处埋下三颗雷! 这不是啥新知识,也不是什么浅显的代码.下面,来淘淘这份经验,呼呼 我们要了解Web browser 这个控件,因为到 ...

HDU 3639 Hawk-and-Chicken(良好的沟通)

HDU 3639 Hawk-and-Chicken 题目链接 题意:就是在一个有向图上,满足传递关系,比方a->b, b->c,那么c能够得到2的支持,问得到支持最大的是谁,而且输出这些人 ...

hdu 4007 Dave (2011年大连ACM网络赛)

题意:给定正方形的边长 r ,在平面内寻找正方形可以圈住的点的最大的个数. 分析:先对点排序,然后固定一条边,再平移另一条垂直边,得到点的个数,最后比较大小即可. 注意:不包含正方形倾斜的情况! // ...

linux memory release commands内存清理/释放命令

linux 内存清理/释放命令 You could find reference from here: http://jingyan.baidu.com/article/597a06436a687f3 ...

《effective Go》读后记录:GO基础

一个在线的Go编译器 如果还没来得及安装Go环境,想体验一下Go语言,可以在Go在线编译器 上运行Go程序. 格式化 让所有人都遵循一样的编码风格是一种理想,现在Go语言通过gofmt程序,让机器来处 ...

微信小程序奇奇怪怪的语法

这...

用Java操作数据库Datetime数据

Date.Calendar.Timestamp的区别.相互转换与使用 1 Java.util.Date 包含年.月.日.时.分.秒信息. // String转换为Date String dateStr ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值