双向链表

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

双链表的主要操作跟单链表一样,具有如下操作

  1. is_empty() 链表是否为空

  2. length() 链表长度

  3. travel() 遍历整个链表

  4. add(item) 链表头部添加元素

  5. append(item) 链表尾部添加元素

  6. insert(pos, item) 指定位置添加元素

  7. remove(item) 删除节点

  8. search(item) 查找节点是否存在

python 实现:

#_*_coding:utf-8_*_

class Node(object):
def __init__(self, item):
self.item = item
self.prev = None
self.next = None class DoubleLinkList(object):
def __init__(self, node=None):
'''_head 作为类内部使用,对外不可见'''
self.__head = node def is_empty(self):
'''判断链表是否为空'''
return self.__head is None def length(self):
'''链表的长度'''
#特别要考虑当链表是空的情况
# cur游标,用来移动遍历节点
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next return count def travel(self):
'''遍历整个链表'''
cur = self.__head if cur == None:
print("empty linklist")
return
while cur != None:
print(cur.item, end=' ')
cur = cur.next
print('')
def add(self,item):
'''在链表头部添加元素,头插法'''
node = Node(item)
#指针指向的顺序可以变化
node.next = self.__head
self.__head = node
node.next.prev = node def append(self,item):
'''在链表尾部添加元素'''
node = Node(item)
cur = self.__head
#如果链表是空,则将头节点直接指向Node
if self.is_empty():
self.__head = node
else:
while cur.next != None:
cur = cur.next cur.next = node
node.prev = cur def insert(self,pos, item):
'''在链表指定的位置添加元素'''
"""
:param pos从0开始
"""
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
node = Node(item) node.next = cur
cur.prev.next = node
cur.prev = node
node.prev = cur.prev def remove(self, item):
'''删除某个元素的节点'''
cur = self.__head
while cur != None :
if cur.item == item:
#先判断此节点是否为头节点
if cur == self.__head:
self.__head = cur.next
if cur.next:
#要判断链表是否只有一个节点
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 != None:
if cur.item == item:
return True
else:
cur = cur.next
return False if __name__ == '__main__':
ll = DoubleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
ll.append(2)
ll.travel()
ll.add(3)
ll.travel()
ll.insert(2, 4)
ll.travel()
print(ll.search(3))
ll.travel()
ll.remove(2)
ll.travel()

运行结果:

True
0
1 2
3 1 2
3 1 4 2
True
3 1 4 2
3 1 4

2020年最新Python教程:

如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?

说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。

以上这些教程小编已经为大家打包准备好了,希望对正在学习的你有所帮助!

获取方式,私信小编 “ 资料 ”,即可免费获取哦!

 

python实现双向链表的操作的更多相关文章

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

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

  2. Python开发【第三篇】:Python基本之文件操作

    Python基本之文本操作 一.初识文本的基本操作 在python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open ...

  3. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  4. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  5. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  6. python os&shutil 文件操作

    python os&shutil 文件操作 # os 模块 os.sep 可以取代操作系统特定的路径分隔符.windows下为 '\\' os.name 字符串指示你正在使用的平台.比如对于W ...

  7. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  8. Python实现浏览器自动化操作

    Python实现浏览器自动化操作 (2012-08-02 17:35:43) 转载▼     最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是 ...

  9. [转载]Python实现浏览器自动化操作

    原文地址:Python实现浏览器自动化操作作者:rayment   最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有不少介绍,例如使用pamie,但是只是支持IE,而且项目也较久没 ...

随机推荐

  1. 记录一次线上bug

    记录一次线上bug,总的来说就是弱网和重复点击.特殊值校验的问题. 测试场景一:        在3g网络或者使页面加载速度需要两秒左右的时候,输入学号,提交学生的缴费项目,提交完一个 学生的缴费后, ...

  2. Happens-before先行发生原则

    简介 从JDK1.5,java使用新的JSR-133内存模型:JSR-133使用happens-before的概念来阐述操作之间的内存可见性:在JMM中,如果一个操作执行的结果需要对另一个操作可见,那 ...

  3. input标签的accept属性、JQuery绑定keyDown事件

    一. input标签的accept属性 当我们上传文件或者注册上传头像时,我们可以一般都是使用: <input type="file" id="my_file&qu ...

  4. CF1324C Frog Jumps 题解

    原题链接 简要题意: 现在河面上有 \(n+2\) 块石头,编号 \(0\) 到 \(n+1\),\(1\)~\(n\) 块石头每块上有一个方向,如果是 \(L\),那么青蛙到这块石头上之后只能往左跳 ...

  5. HDU-1251 统计难题(我就是不用字典树)

    统计难题 ?戳这里可以前往原题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为 ...

  6. Contest 155

    2019-09-27 22:39:24 总体感受:这次比赛心态不够好,最后导致没有很好的完成比赛. 注意点: 1)保持心态稳定,是情商的体现: 2)hard题的覆盖还是明显不够: 1201. Ugly ...

  7. 带有路径压缩和rank优化的并查集实现

    public class unionfind2 implements UF { int[] parent; int[] rank; public unionfind2(int n) { parent= ...

  8. 搭建SQL server AwaysOn集群

    1.环境 系统:windows server 2012 R2 数据库版本:SQL server 2012 三台服务器,IP分别是:10.10.10.111,10.10.10.112,10.10.10. ...

  9. Oracle数据库开机自启动的配置

    如果服务器断电重启或计划内重启,在服务器的操作系统启动后,需要手工启动数据库实例和监听,本文介绍如何把Oracle数据库的启动和关闭配置成系统服务,在操作系统启动/关闭时,自动启动/关闭Oracle实 ...

  10. JS去除字符串内的空白字符方法

    有时我们需要对用户的输入进行一些处理,比如用户输入的密码或者用户名我们就需要去除前后空格,下面写一个去除空白字符的方法 function trim(string = '') { return stri ...