python3 数据结构----链表

本文详细介绍Python中链表的数据结构实现,包括单链表的创建、节点添加、删除、修改及显示等基本操作。通过具体代码示例,读者可以深入理解链表的工作原理和应用场景。

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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值