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

yipeiwu_com5年前Python基础

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

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

链表由一个个节点组成。

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

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

单向列表的结构如下图:

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

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

插入一个新节点:

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

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

删除一个节点:

原理:找到要删除节点的上一个节点,直接上一个节点的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
——————————————————————————————————————

双向链表的结构如下图:

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

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

插入一个新节点:

原理:

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

删除一个节点:

说明:

找到要删除的节点的上一个节点
直接把上一个节点的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加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

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

相关文章

python2 与 python3 实现共存的方法

python2 与 python3 实现共存的方法

1.现在我本机系统已内置python2.6 2.下载进行源码安装 复制链接下载到/root/mypackage,解压 接着 mkdir /usr/local/python3 然后在解...

PyTorch的自适应池化Adaptive Pooling实例

PyTorch的自适应池化Adaptive Pooling实例

简介 自适应池化Adaptive Pooling是PyTorch含有的一种池化层,在PyTorch的中有六种形式: 自适应最大池化Adaptive Max Pooling: torch....

Django RBAC权限管理设计过程详解

Django RBAC权限管理设计过程详解

一.权限简介 1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影《2012》中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临;② 屌丝们,有没有想过为...

详解使用Python下载文件的几种方法

在使用Python进行数据抓取的时候,有时候需要保持文件或图片等,在Python中可以有多种方式实现。今天就一起来学习下。 urllib.request 主要使用的是urlretrie...

Python OS模块常用函数说明

Python的标准库中的os模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在L...