Python单向链表和双向链表原理与用法实例详解


Posted in Python onAugust 31, 2018

本文实例讲述了Python单向链表和双向链表原理与用法。分享给大家供大家参考,具体如下:

链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大。

链表由一个个节点组成。

单向链表的节点分为两个部分:存储的对象和对下一个节点的引用。注意是指向下一个节点。

而双向链表区别于单向链表的是它是由三个部分组成:存储的对象、对下一个节点的引用、对上一个节点的引用,可以实现双向遍历。

单向列表的结构如下图:

Python单向链表和双向链表原理与用法实例详解

head是头节点,tail是尾节点,每个节点由Data存储对象和Next对下一个节点引用组成

下面说一下单向链表插入和删除的过程。

插入一个新节点:

Python单向链表和双向链表原理与用法实例详解

原理:前一个节点的Next指向当前新节点,新节点的Next指向要插入节点位置的后一个节点。

注意:在实际应用时需要考虑插入位置是头结点和尾节点的情况。

删除一个节点:

Python单向链表和双向链表原理与用法实例详解

原理:找到要删除节点的上一个节点,直接上一个节点的Next指向删除位置的下一个节点。

注意:在实际应用中需要考虑到删除的节点是否是头节点或尾节点,需要考虑到链表的长度。

下面附上一个用python写的单链表的例子。

class Node:
  next = None
  data = None
  def __init__(self,nodeData):
    self.data = nodeData
class List:
  head = None
  size = 0
  def __init__(self):
    self.size = 0
    self.head = None
  #遍历链表
  def a(self):
    print("avx")
  def printlist(self):
    p=self.head
    while(p is not None):
      print(p.data)
      p=p.next
    print("——————————————————————————————————————")
  def insertlink(self, a, newdata):
    newnode = Node(newdata)
    if self.size == 0:
      print("The link is none")
      self.head = newnode
      self.size = self.size+1
    else:
      p = self.head
      while(p is not None )and (p.data != a):
        p = p.next
      if p.next is None:
        p.next = newnode
        self.size = self.size + 1
      else:
        newnode.next = p.next
        p.next = newnode
        self.size = self.size + 1
  #删除链表中的节点
  def deldata(self,a):
    if self.size == 0:
      print("The link is none")
    elif self.size ==1:
      self.head = None
      self.size = self.size -1
    else:
      p = self.head
      while(p is not None )and (p.data != a):
        q = p
        p = p.next
      if p is None:
        print("Can't find a")
      elif p == self.head:
        self.head = p.next
      elif p.data ==a and p.next is not None:
        q.next = q.next.next
        self.size = self.size - 1
      else:
        q.next = None
        self.size = self.size - 1
  #修改链表中的指定节点
  def updatelink(self,a,b):
    p = self.head
    print(p.data)
    while(p is not None ) and (p.data!=a):
      p = p.next
    if p is None:
      print("Can't find a")
    else:
        p.data = b
if __name__=="__main__":
    p = List()
    p.insertlink(1,1)
    p.insertlink(1,2)
    p.insertlink(1,3)
    p.insertlink(1,4)
    print("_________________________---insertlink")
    p.printlist()
    print("_________________________--chalink")
    p.updatelink(2,5)
    p.printlist()
    print("___________________________-----dellink")
    p.deldata(5)
    p.printlist()

运行结果:

The link is none
_________________________---insertlink
1
4
3
2
——————————————————————————————————————
_________________________--chalink
1
1
4
3
5
——————————————————————————————————————
___________________________-----dellink
1
4
3
——————————————————————————————————————

双向链表的结构如下图:

Python单向链表和双向链表原理与用法实例详解

head是头节点,tail是尾节点,每个节点由Data存储对象,Next对下一个节点的引用和Pre对上一个节点的引用组成。可以实现双向的遍历

下面说一下双向链表的插入和删除

插入一个新节点:

Python单向链表和双向链表原理与用法实例详解

原理:

找到要插入的节点位置,新节点的Next指向插入位置的下一个节点,插入位置的下一个节点的Pre指向新节点。
插入位置节点的左侧Next指向新节点,新节点的Pre指向左侧的节点。

删除一个节点:

Python单向链表和双向链表原理与用法实例详解

说明:

找到要删除的节点的上一个节点
直接把上一个节点的Next指向要删除节点的下一个节点
并把要删除节点的下一个节点的Pre指向要上出节点的上一个节点即可

双向链表的代码:

class Node():
  data = None
  nextnode = None
  prenode = None
  def __init__(self, data):
    self.data = data
class PersonChan():
  size = 0
  head = None
  tail = None
  def __init__(self):
    self.head = None
    self.tail = None
    self.size = 0
  #增加节点
  def add_node(self, a):
    newnode = Node(a)
    if(self.head == None):
      self.head = newnode
      self.head.prenode = None
      self.tail = newnode
      self.tail.prenode = None
      self.tail.nextnode = None
      self.size = self.size+1
    else:
      temp = self.head
      while temp.nextnode is not None:#返回尾节点tail
        temp = temp.nextnode
      temp.nextnode = newnode
      self.tail = newnode
      self.tail.prenode = temp
      self.tail.nextnode = None
      self.size = self.size+1
  #在查找到的a后面增加节点
  def ins_node(self,a,b):
    newnode = Node(b)
    if self.head ==None:
      self.head = newnode
      self.tail = newnode
      print("Insert success:",newnode.data)
      self.size = self.size +1
    else:
      temp = self.head
      while(temp is not None)&(temp.data != a):
        temp = temp.nextnode
      if temp.nextnode == None:
        temp.nextnode = newnode
        self.tail = newnode
        self.tail.prenode = temp
        self.tail.nextnode = None
        temp = None
        print("Insert success:",newnode.data)
        self.size = self.size+1
      else:
        newnode.prenode = temp
        newnode.nextnode = temp.nextnode
        temp.nextnode = newnode
        print("Insert success:",newnode.data)
        self.size = self.size+1
  #删除节点
  def del_node(self,a):
    if self.head == None:
      pass
    elif self.head.data == a:
      if self.size ==1:
        self.head = None
        self.tail = None
        self.size = self.size-1
      else:
        self.head = self.head.nextnode
        self.size = self.size -1
    else:
      temp = self.head.nextnode
      while (temp is not None) and (temp.data != a):
        temp = temp.nextnode
      p = temp.prenode
      if temp != None:
        if temp.nextnode == None:
          self.tail = p
          self.tail.nextnod = None
        else:
          p.nextnode = temp.nextnode
          temp = None
        self.size = self.size -1
        print("Delete is success:",a)
  def listall(self):#正序排列
    if self.size == 0:
      print("No data in the list")
    else:
      temp = self.head
      while(temp is not None):
        print(temp.data)
        temp = temp.nextnode
  def lista(self):#倒序排列
    if self.size == 0:
      print("No data in the list")
    temp = self.tail
    while(temp is not None):
      print(temp.data)
      temp = temp.prenode
if __name__ == '__main__':
  link = PersonChan()
  link.add_node(1)
  link.add_node(2)
  link.add_node(3)
  link.add_node(4)
  link.listall()
  print("The list's size is:",link.size)
  link.lista()

运行结果:

1
2
3
4
("The list's size is:", 4)
4
3
2
1

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python多进程机制实例详解
Jul 02 Python
Python 3中的yield from语法详解
Jan 18 Python
浅谈对yield的初步理解
May 29 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
pandas数据分组和聚合操作方法
Apr 11 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
python统计字符的个数代码实例
Feb 07 Python
利用python绘制数据曲线图的实现
Apr 09 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 #Python
浅谈Python traceback的优雅处理
Aug 31 #Python
python梯度下降法的简单示例
Aug 31 #Python
wxPython的安装与使用教程
Aug 31 #Python
python traceback捕获并打印异常的方法
Aug 31 #Python
基于python中theano库的线性回归
Aug 31 #Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 #Python
You might like
php 获取远程网页内容的函数
2009/09/08 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
PHP重载基础知识回顾
2020/09/10 PHP
javascript中字符串的定义示例代码
2013/12/19 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
2015/12/13 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
python使用json序列化datetime类型实例解析
2018/02/11 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
柏林通行证:Berlin Pass
2018/04/11 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
大学生毕业求职简历的自我评价
2013/10/24 职场文书
化工专业应届生求职信
2013/11/08 职场文书
高中语文教学反思
2014/01/16 职场文书
研究生毕业鉴定
2014/01/29 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
企业宣传口号
2014/06/12 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
2014年车间工作总结
2014/11/21 职场文书
企业宣传语大全
2015/07/13 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
小学班主任工作随笔
2015/08/15 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS