思路

链表由节点组成,先规定节点(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. CentOS7.2调整Mysql数据库最大连接数

    mysql数据库最大连接数=max_connections+11:root连接,用于管理员连接数据库进行维护操作查看最大连接数:show variables like 'max_connections ...

  2. JAVA消息确认机制之ACK模式

    JMS API中约定了Client端可以使用四种ACK模式,在javax.jms.Session接口中: AUTO_ACKNOWLEDGE = 1    自动确认 CLIENT_ACKNOWLEDGE ...

  3. TCP服务端开发为例--web开发不同url请求为何会走不同方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...

  4. SpringBoot日记——分布式篇

    思考:什么是分布式?什么是微服务? 一些概念:RPC-远程过程调用,某台机器想要调用另一台机器所需要的一种服务,及分布式的服务框架,比如dubbo或者SpringCloud. 铺天盖地的分布式互联网系 ...

  5. 用PHP山寨一款软件

    什么是我国软件工程师引以为豪的能力?山寨.山寨,山寨! 我国程序员的山寨能力是世界一流的.这一点在世界范围内令人闻风丧胆.世界上根本就找不到一款我国工程师不能山寨的软件. 今天,锋哥教大家来山寨一款软 ...

  6. webpack笔记

    打包 img src src 必须以 点(.) 开始,才能被打包. 如: ./img/logo.png ../img/logo.png 使用 process a.js window.Base_Url ...

  7. 基于MongodbDB的用户认证-运维笔记

    MongoDB默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,MongoDB认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它,可能这些对一些要求高 ...

  8. libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案

    线上一台服务器在执行leveldb程序的时候,报错:"libc.so.6: version `GLIBC_2.14' not found". 排查原因及解决方法如下: 1)产生原因 ...

  9. 个人博客作业Week3--必应词典案例分析

    第一部分  调研,评测 (软件的bug,功能评测,黑箱测试,第8章 用户调研,12 章软件的用户体验) 下载并使用,按照描述的bug定义,找出几个功能性的比较严重的bug.至少两个.用专业的语言描述( ...

  10. java-过滤器、拦截器

    1.基础知识 1.1面向对象编程(OOP).面向切面编程(AOP) 面向对象编程: 将需求功能划分为不同的.相对独立的和封装良好的类,使他们有属于自己的行为,依靠继承和多态等来定义彼此的关系. 面向切 ...