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标准库urllib2的一些使用细节总结
Mar 16 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
Python选择网卡发包及接收数据包
Apr 04 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
python根据时间获取周数代码实例
Sep 30 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
python调用百度API实现人脸识别
Nov 17 Python
python中复数的共轭复数知识点总结
Dec 06 Python
python实现定时发送邮件
Dec 23 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中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
jQuery 获取URL参数的插件
2010/03/04 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
详解jQuery中的事件
2016/12/14 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
python实现简单的socket server实例
2015/04/29 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
学习两会精神心得范文
2014/03/17 职场文书
党员干部公开承诺书
2014/03/26 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技