# coding:utf-8

# 双向链表的相关操作:
# is_empty() 链表是否为空
# length() 链表长度
# travel() 遍历链表
# add(item) 链表头部添加
# append(item) 链表尾部添加
# insert(pos, item) 指定位置添加
# remove(item) 删除节点
# search(item) 查找节点是否存在 class Node(object):
"""节点""" def __init__(self, item):
self.elem = item
self.prev = None
self.next = None class DoubleLinkedList(object):
"""双向链表""" def __init__(self, node=None):
self.__head = node def is_empty(self):
"""链表是否为空"""
return self.__head is None def length(self):
"""链表长度"""
cur = self.__head
count = 0
while cur is not None:
count += 1
cur = cur.next
return count def travel(self):
"""遍历链表"""
cur = self.__head while cur is not None:
print(cur.elem, end=" ")
cur = cur.next print("") def add(self, item):
"""链表头部添加,头插法"""
node = Node(item) # 注意处理链表为空的情况
if self.is_empty():
self.__head = node
else:
node.next = self.__head
self.__head = node
node.next.prev = node def append(self, item):
"""链表尾部添加,尾插法"""
node = Node(item) if self.is_empty():
self.__head = node
else:
cur = self.__head while cur.next is not None:
cur = cur.next # cur当前指向最后一个节点
cur.next = node
node.prev = cur def insert(self, pos, item):
"""指定位置添加"""
node = Node(item) # 头插法
if pos <= 0:
self.add(item)
# 尾插法
elif pos > (self.length() - 1):
self.append(item)
# 中间插入
else:
cur = self.__head
count = 0 while count < pos:
count += 1
cur = cur.next # 循环结束,cur指向要插入的位置
node.next = cur
node.prev = cur.prev
cur.prev.next = node
cur.prev = node def remove(self, item):
"""删除节点"""
# 先考虑一般情况,再看一般情况下的代码是否适合特殊情况
cur = self.__head while cur is not None:
if cur.elem == item:
# 判断此节点是否是头节点
if cur == self.__head:
self.__head = cur.next
# 判断链表中是否只有一个节点
if cur.next is not None:
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 is not None:
if cur.elem == item:
return True
else:
cur = cur.next return False if __name__ == "__main__":
dll = DoubleLinkedList() print("before initialized:", dll.is_empty())
print("before initialized:", dll.length()) dll.add(1)
dll.add(2)
dll.add(3)
dll.add(4)
dll.add(5)
dll.add(6)
dll.travel() dll.append(7)
dll.travel() dll.insert(3, 100)
dll.travel() dll.remove(3)
dll.travel()

数据结构与算法-python描述-双向链表的更多相关文章

  1. 数据结构与算法-python描述-单向循环链表

    # coding:utf-8 # 单向循环链表的相关操作: # is_empty() 判断链表是否为空 # length() 返回链表的长度 # travel() 遍历 # add(item) 在头部 ...

  2. 数据结构与算法-python描述-单链表

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

  3. 《数据结构与算法JavaScript描述》

    <数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...

  4. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  5. 数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

    前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是 ...

  6. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  7. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  8. 列表的实现-----数据结构与算法JavaScript描述 第三章

    实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...

  9. 《数据结构与算法JavaScript描述》中的一处错误

    最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...

随机推荐

  1. python之Python内置函数一览表

    Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块. 如果你熟悉 Shell 编程,了解什么是 Shell 内置命令,那么你也很容易理解什么是 Python 内置函数 ...

  2. 解惑求助-关于NetCore2.2中间件响应的问题

    背景介绍:基于netcore2.2开发api接口程序,自定义了一个异常捕获中间件,用于捕获未经处理的异常以及状态码404.500等访问(设计的出发点就是,出现了非200的响应,我这边全部会进行处理成2 ...

  3. VIOS挂载ISO文件

    6.VIOS挂载ISO文件 1.给vhost建立虚拟设备 mkvdev -vadapter vhostX -fbo -dev cdx 2.建立存放ISO的资料库 mkrep -sp rootvg -s ...

  4. POJ1905

    题目链接:http://poj.org/problem?id=1905 题目大意: 竹竿受热会膨胀.设其原长为 L ,受热膨胀后的长度 L'=(1+n*C)*L ,其中 n, C, L都是要输入的参数 ...

  5. 21-8 数据检索2 top和distinct

    --distinct关键字,根据已经查询出的结果然后去除重复 select distinct * from TblStudent --Top(一般会配合order by一起使用) ---------- ...

  6. 【JavaScript数据结构系列】00-开篇

    [JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...

  7. 读-写锁 ReadWriteLock & 线程八锁

    读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...

  8. 这个Maven依赖的问题,你敢说你没遇到过

    Maven 依赖没处理好的话经常会导致发生一些问题,非常烦.今天给大家分享一个依赖相关的问题,说不定你之前就遇到过. 问题背景 有个 ES 搜索的项目,刚开始还是好好的状态,过了一段时间,然后就发现启 ...

  9. 郭盛华:DNS新漏洞可使黑客可以发起大规模DDoS攻击

    近日,知名网络黑客安全专家.东方联盟创始人郭盛华微博披露了有关影响DNS协议的新缺陷的详细信息,该缺陷可被利用来发起放大的大规模分布式拒绝服务(DDoS)攻击,以击倒目标网站.该漏洞称为NXNSAtt ...

  10. 常用docker命令备忘录

    查看镜像 docker images 查看运行中的容器 docker ps 删除镜像 docker rmi 容器id 直接删除所有镜像 docker rmi `docker images -q` 直接 ...