本文实例讲述了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程序设计有所帮助。
Python,单向链表,双向链表
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]