思路

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

  1. 初始化

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

  2. 添加

    分两种情况:

    1. 链表为空,那么头节点和尾节点都指向新插入的节点
    2. 链表不为空,那么直接在尾部添加即可
  3. 遍历

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

  4. 删除某个节点

    删除的时候分4种情况:

    1. 链表为空的时候
    2. 头节点,此时更改头节点的prev
    3. 尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可
    4. 中间的节点,修改要删除的节点的前驱和后继节点的next和prev指向就好
  5. 搜寻

    遍历查找即可

  6. 清空链表

    将头节点和尾节点都置为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的双向链表实现的更多相关文章

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

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

  2. Python 实现双向链表(图解)

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

  3. python实现双向链表的操作

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

  4. python实现双向链表

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

  5. Python数据结构--双向链表

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

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

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

  7. 内存淘汰机制——LRU与LFU

    内存淘汰机制之LRU与LFU LRU(Least Recently Used):淘汰 近期最不会访问的数据 LFU(Least Frequently Used):淘汰 最不经常使用(访问次数少) 所谓 ...

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

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

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

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

随机推荐

  1. Robot Framework的日期处理

    http://www.cnblogs.com/channy14/p/6160831.html http://blog.csdn.net/r455678/article/details/52993765

  2. [Spark][Python]获得 key,value形式的 RDD

    [Spark][Python]获得 key,value形式的 RDD [training@localhost ~]$ cat users.txtuser001 Fred Flintstoneuser0 ...

  3. Spring 中配置log4j日志功能

    一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包 二,创建 log4j.properties 配置文件 log4j.prope ...

  4. [译]Kubernetes 分布式应用部署和人脸识别 app 实例

    原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出 ...

  5. OpenDaylight(Oxygen)安装feature出现错误的解决方案

    在使用OpenDaylight控制器时,初次进入karaf命令行下都需要先进行feature的安装 在使用Nitrogen版本(0.7.x)时,组件的安装可以类似 feature:install od ...

  6. vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释

    本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...

  7. uml 图学习记录

    UML类图与类的关系详解   2011-04-21 来源:网络   在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...

  8. visual studio 2013的使用和单元测试

    Visual Studio 2013 是一个先进的开发解决方案,各种规模的团队通过它均可设计和创建引人注目的应用程序.Visual Studio 13在新功能包括C#和VB编译器和IDE支持完全基于. ...

  9. Rop框架学习笔记

    1.  提供了开发服务平台的解决方案:比如应用认证.会话管理.安全控制.错误模型.版本管理.超时限制 2.  启动:RopServlet截获http请求 配置: <servlet> < ...

  10. linux内核分析第七次实验

    实验: rm menu -rf git clone https://github.com/megnning/menu.git cd menu ls mv test_exec.c test.c vi t ...