本文实例讲述了Python单向链表和双向链表原理与用法。分享给大家供大家参考,具体如下:
链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大。
链表由一个个节点组成。
单向链表的节点分为两个部分:存储的对象和对下一个节点的引用。注意是指向下一个节点。
而双向链表区别于单向链表的是它是由三个部分组成:存储的对象、对下一个节点的引用、对上一个节点的引用,可以实现双向遍历。
单向列表的结构如下图:
head是头节点,tail是尾节点,每个节点由Data存储对象和Next对下一个节点引用组成
下面说一下单向链表插入和删除的过程。
插入一个新节点:
原理:前一个节点的Next指向当前新节点,新节点的Next指向要插入节点位置的后一个节点。
注意:在实际应用时需要考虑插入位置是头结点和尾节点的情况。
删除一个节点:
原理:找到要删除节点的上一个节点,直接上一个节点的Next指向删除位置的下一个节点。
注意:在实际应用中需要考虑到删除的节点是否是头节点或尾节点,需要考虑到链表的长度。
下面附上一个用python写的单链表的例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
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指向要上出节点的上一个节点即可
双向链表的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
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程序设计有所帮助。
原文链接:https://www.cnblogs.com/meitian/p/4584020.html