python3 数据结构----链表

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()
发布了270 篇原创文章 · 获赞 408 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/u014453898/article/details/103518633