python 实现双向链表

python 实现双向链表

class Item(object):#定义链表的每一个节点
    def __init__(self,data,last=None,next=None,):
        self.data = data #以字典形式,存放数据
        self.last = last#用于指向上一个节点
        self.next = next #用于指向下一个节点

class LinkedList(object): #实现链表的主要结构与各功能
    def __init__(self):
        self.head = Item({},)#定义头节点,不存放数据

    def add(self,data): #增加一个节点
        sign = self.head
        while True: #找到sign.next == None,即链表尾部
            if sign.next == None:
                break
            sign = sign.next
        body = Item(data,last=sign)#用传过来的数据实例化一个节点对象,last指向链表尾部
        sign.next = body #连接到链表尾部

    def move(self,keyword,keyvalue):#根据关键词,删除一个节点
        sign = self.head.next #游标,判断链表走到哪里了
        status = True #状态,判断是否找到了符合要求的的节点
        while True:
            try:
                if keyvalue == sign.data[keyword]:#根据关键词查找是否存在该节点
                    break
            except KeyError as e:#如果关键词有误,抛出异常并返回False
                print('Key1Error:数据中不存在%s' %e )
                return False
            if sign.next == None:#如果走到链表尾部,说明没有找到该节点
                status = False
                break
            sign = sign.next
        if status:#如果删除成功,返回True,不成功返回False
            sign.last.next = sign.next
            if sign.next != None:
                sign.next.last = sign.last
            sign.last = None
            return True
        else:
            return False


    def update(self,data,keyword=None,keyvalue=None):#修改节点数据
        if keyword:#定位节点
            sign = self.head.next
            status = True
            while True:
                try:
                    if keyvalue == sign.data[keyword]:
                        break
                except KeyError as e:  # 如果关键词有误,抛出异常并返回False
                    print('Key1Error:数据中不存在%s' % e)
                    return False
                if sign.next == None:
                    status = False
                    break
                sign = sign.next
            if status:#更新data数据
                sign.data = data
                return True
            else:
                return False

    def get(self,index):#根据位置查找
        res = self.get_all()#获取到列表形式链表结构
        try:#按照输入的下标查找
            return res[index]
        except:
            return None

    def get_all(self):#查找整个链表数据
        sign = self.head
        res = []
        while True:#遍历整个链表,并转成列表形式
            if sign.next == None:
                if sign.data:
                    res.append(sign.data)
                break
            else:
                if sign.data:
                    res.append(sign.data)
                sign = sign.next
        return res

    def size(self):  #获取链表有效数据个数
        return len(self.get_all())#直接输出列表形式的链表长度即有效数据个数
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值