本文转载自微信公众号「python与大数据分析」,作者一只小小鸟鸟。转载本文请联系python与大数据分析公众号。
今天终于把大学都没想明白的链表数据结构整明白了,也算小小的收获,挺好玩的。文后附链表操作示意图。
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- isempty(self) 链表是否为空
- length(self) 链表长度
- travel(self) 遍历整个链表
- add(self,item) 链表头部添加元素
- append(self,item) 链表尾部添加元素
- insert(self,item,index) 指定位置添加元素
- deletebyitem(self,item) 根据数据项删除节点
- deletebyindex(self,index) 根据索引位置删除节点
- search(self,item) 根据数据项查找节点是否存在
- update(self,index,item) 暂无实现
- getitem(self,index) 获取索引位置对应的数据项
- getindex(self,item) 获取数据项对应的索引位置
代码基本为原创,经过大量重写
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
def __repr__(self):
pass
def __str__(self):
return str(self.item)
class SingleLinkList(object):
def __init__(self):
self.header = None
self.currentnum=0
def isempty(self):
return self.header == None
def length(self):
return self.currentnum
def travel(self):
cur =self.header
while cur !=None:
print("{}".format(cur.item),end=" ")
cur=cur.next
print("\r")
def add(self,item):
node=Node(item)
# 新节点的链接指向头节点
node.next=self.header
# 链表的头指向新节点
self.header=node
self.currentnum+=1
def append(self,item):
tempnode=self.header
node=Node(item)
if self.isempty():
self.add(node)
else:
while tempnode.next!=None:
tempnode=tempnode.next
tempnode.next=node
self.currentnum+=1
def insert(self,item,index):
node=Node(item)
tempnode=self.header
if index>self.currentnum+1 or index<=0:
raise IndexError("{} is not find in Linklist".format(index))
# 指定位置为第一个即在头部插入
if index==1:
self.add(node)
elif index>self.currentnum-1:
self.append(node)
else:
for i in range(1,index-1):
tempnode=tempnode.next
node.next=tempnode.next
tempnode.next=node
self.currentnum+=1
def deletebyitem(self,item):
tempnode=self.header
prenode=None
while tempnode!=None:
if tempnode.item==item:
if tempnode==self.header:
self.header=tempnode.next
else:
prenode.next=tempnode.next
break
else:
prenode=tempnode
tempnode=tempnode.next
def deletebyindex(self,index):
if index>self.currentnum or index<=0:
raise IndexError("{} is not find in Linklist".format(index))
i=1
tempnode=self.header
prenode=self.header
if index==1:
self.header = tempnode.next
self.currentnum-=1
return
while tempnode.next and i<index:
prenode = tempnode
tempnode = tempnode.next
i+=1
if i==index:
prenode.next=tempnode.next
self.currentnum-=1
def search(self,item):
tempnode=self.header
while tempnode!=None:
if tempnode.item==item:
return True
else:
tempnode=tempnode.next
return False
def update(self,index,item):
pass
def getitem(self,index):
if index<=0 or index>self.currentnum:
raise IndexError("{} is not find in Linklist".format(index))
tempnode=self.header
i=1
while i<index:
tempnode=tempnode.next
i+=1
return tempnode.item
def getindex(self,item):
tempnode = self.header
i=0
flag=False
while tempnode != None:
i+=1
if tempnode.item == item:
flag=True
return i
else:
tempnode = tempnode.next
if flag==False:
return 0
if __name__ == '__main__':
a = SingleLinkList()
a.add(1) # 1
print('a.add(1)')
a.travel()
a.add(2) # 2 1
print('a.add(2)')
a.travel()
a.append(3) # 2 1 3
print('a.append(3)')
a.travel()
a.insert(4, 2) # 2 1 4 3
print('a.insert(2, 4)')
a.travel()
print('a.search(1)=',a.search(1))
print('a.search(5)=', a.search(5))
print('a.getindex(1)=',a.getindex(1))
print('a.getindex(5)=', a.getindex(5))
print('a.getitem(2)=', a.getitem(2))
print('a.getitem(4)=', a.getitem(4))
print('a.getitem(3)=', a.getitem(3))
# a.deletebyitem(5)
# print('a.deletebyitem(5)')
# a.travel()
# a.deletebyitem(4)
# print('a.deletebyitem(4)')
# a.travel()
# a.deletebyitem(2)
# print('a.deletebyitem(2)')
# a.travel()
a.deletebyindex(4)
print('a.deletebyindex(4)')
a.travel()
a.deletebyindex(2)
print('a.deletebyindex(2)')
a.travel()
a.deletebyindex(1)
print('a.deletebyindex(1)')
a.travel()
- 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.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
结果如下
C:\python\pyproject\pythonalgorithms\venv\Scripts\python.exe C:/python/pyproject/pythonalgorithms/linklist.py
a.add(1)
1
a.add(2)
2 1
a.append(3)
2 1 3
a.insert(2, 4)
2 4 1 3
a.search(1)= True
a.search(5)= False
a.getindex(1)= 3
a.getindex(5)= 0
a.getitem(2)= 4
a.getitem(4)= 3
a.getitem(3)= 1
a.deletebyindex(4)
2 4 1
a.deletebyindex(2)
2 1
a.deletebyindex(1)
1
Process finished with exit code 0
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
链表头部增加节点示意图
从链表尾部增加节点示意图