思路

链表由节点组成,先规定节点(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. 免安装的Tomcat基本配置和安装

    大家都知道tomcat吧!因为Tomcat 技术先进.性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器,也是运行Servlet和JS ...

  2. ASP HTMLEncode/HTMLDecode

    asp 有Server.HTMLEncode 却没有 Server.HTMLDecode....... 需要自定义一个 HTMLDecode 函数: Function HTMLDecode(sText ...

  3. [转]Linux下安装Java环境配置步骤详述

    1.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择 ...

  4. Scala学习(五)---Scala中的类

    Scala中的类 摘要: 在本篇中,你将会学习如何用Scala实现类.如果你了解Java或C++中的类,你不会觉得这有多难,并且你会很享受Scala更加精简的表示法带来的便利.本篇的要点包括: 1. ...

  5. SSL踩坑ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    最近公司项目开发了一个微信小程序,并且部署测试OK,由于微信小程序调用的后端接口必须是HTTPS,所以给接口安装了SSL,第一天测试都正常.第二天早上再使用时页面无响应. 抓包发现是后端接口抛出: n ...

  6. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. 《Linux内核设计与实现》 第十八章学习笔记

    调  试 一.准备开始 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 知道这个bug最早出现在哪个内核版本中. 1.想要成功进行调试: 让这些错误重现 抽象出问题 从代码中搜索 二. ...

  8. Beta版会议总结

    开会时间:2015年06月12日 开会地点:基教601 开会人员:李想,王颖瑞,朱少辉,陈晨,侯涛亮. 开会内容:对于6月10日,大一同学的投票情况进行讨论和反思. 讨论结果如下: 一.目前存在的问题 ...

  9. mysql的group_concat对应oracle的wm_concat

    mysql的group_concat对应oracle的wm_concat http://bey2nd.blog.163.com/blog/static/12063183120124313360964/

  10. 【Java集合的详细研究4】Java中如何遍历Map对象的4种方法

    方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...