python使用链表
单链表:
import gc #垃圾回收
class ListNode: #结点类
def __init__(self, x):
self.val = x
self.next = None
class LinkedList: #链表类
def __init__(self):
self.__head = ListNode(None) #初始化建立头节点
self.__num = 0
self.end = self.__head #建立尾节点
def __len__(self):
return self.__num
#加节点操作(单个)
def addNode(self,x):
x = ListNode(x)
self.end.next = x
self.end = x
self.end.next = None
self.__num += 1
#加节点操作(多个)
def addList(self,l:list):
for x in l:
x = ListNode(x)
self.end.next = x
self.end = x
self.end.next = None
self.__num += len(l)
#删除节点操作,可按值删除,可按索引删除
def deleteNode(self,x,op='val'):
assert op =='val' or op=='index' #op必须为val或者index
head = self.__head.next
preNode = self.__head #删除操作必须要一前一后两个指针变量
if head == None:print('empty List!')
if op =='val':
while head!= None:
if head.val == x:
preNode.next = head.next
head.next = None
del head
gc.collect()
head = preNode.next
self.__num -=1
else:
head = head.next
preNode = preNode.next
if op =='index':
if isinstance(x,list):
x.sort(reverse=True) #从大到小排序,先删除链表靠后的节点就不会影响index的次序
for index in x:
for i in range(index):
head = head.next
preNode = preNode.next
preNode.next = head.next
head.next = None
del head
gc.collect()
self.__num -= 1
head = self.__head.next
preNode = self.__head
else:
for i in range(x):
head = head.next
preNode = preNode.next
preNode.next = head.next
head.next = None
del head #删除head指针变量指向的结点
gc.collect() #删除的内容马上释放
self.__num -= 1
def modifyByVal(self,old,new):
head = self.__head.next
while head !=None:
if head.val == old:
head.val = new
head = head.next
def modifyByIndex(self,indexes,val):
assert isinstance(indexes,list)
head = self.__head.next
for index in indexes:
for i in range(index):
head = head.next
head.val = val
head = self.__head.next
def showList(self):
result = []
if self.__num == 0:
print('empty List!')
return None
else:
head = self.__head.next
while head != None:
result.append(head.val)
head = head.next
print(result)
def getList(self)->ListNode:
return self.__head
if __name__ == '__main__':
l = LinkedList()
l.addList([7,4,5,4,1,2])
l.showList()
l.deleteNode(4,op='val')
l.showList()
l.modifyByIndex([2,0],0)
l.showList()