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