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

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

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

链表由一个个节点组成。

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

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

单向列表的结构如下图:

2018831145141756.png?2018731145221

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

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

插入一个新节点:

2018831145252344.png?2018731145314

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

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

删除一个节点:

2018831145330330.png?2018731145352

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

——————————————————————————————————————

双向链表的结构如下图:

2018831145437588.png?201873114556

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

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

插入一个新节点:

2018831145532209.png?2018731145550

原理:

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

插入位置节点的左侧Next指向新节点,新节点的Pre指向左侧的节点。

删除一个节点:

2018831145604666.png?2018731145623

说明:

找到要删除的节点的上一个节点

直接把上一个节点的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单向链表和双向链表原理与用法实例详解

本文地址: http://www.cppcns.com/jiaoben/python/238728.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值