python数据结构实现——单双链表

python数据结构实现——单双链表

本模块是相关算法和数据结构、科学计算的相关实现代码
主要是想将一些常用的算法实现一遍 当然 以后做ML可能用得到(手动滑稽
目标:做成一个工具包(好吧 用py写的算法包可能我自己都不敢用
在这里插入图片描述

代码分析: 写了四个类 分别是单双链表的结点创建和链表创建操作类
奈何苦于就 交易♂ 语言 没有指针操作 所以我主要用了对象存储和gc机制
操作的时候用了自定义的probe指针(毕竟直接用对象操作容易把对象回收了 特别是在实现指针移动的功能时)

#part one:单链表
class Node_new_single(object):#链表生成类
    def __init__(self,data,next):
        self.data=data
        self.next=next
class Single_link(object):#链表操作类
    def __init__(self,list=[]):
        self.position=-1
        self.head=None
        if list==[]:
            self.head=Node_new_single(None,None)
        else:
            while True:
                try:
                    self.data = list[self.position]
                    self.position-=1
                    self.head=Node_new_single(self.data,self.head)
                except IndexError:
                    break
    def __len__(self):
        self.i=0
        self.probe=self.head
        while self.probe!=None:
            self.i+=1
            self.probe=self.probe.next
        return self.i
    def throught(self):
        self.dataList=[]
        self.probe=self.head
        while self.probe!=None:
            self.dataList.append(self.probe.data)
            self.probe=self.probe.next
        return self.dataList
    def delete(self,delete_data):
        self.probe = self.head
        if self.probe.data==delete_data:
            self.head=self.head.next
            self.delete(delete_data)
        else:
            while self.probe.next != None:  #如果不是最后一个元素的话
                if self.probe.next.data==delete_data:  #如果下一个元素为目标
                    if self.probe.next.next==None:    #如果下一个元素为最后一个
                        self.probe.next=None
                    else:
                        self.probe.next=self.probe.next.next
                else:
                    self.probe=self.probe.next
    def change_by_value(self,data_changeby,*args):
        self.probe = self.head
        while self.probe!=None:
            if self.probe.data in args:
                self.probe.data=data_changeby
            self.probe=self.probe.next
    def change_by_position(self,data_changeby,position):
        if (position>len(self)) or (position<1):
            raise ValueError
        self.probe = self.head
        position-=1
        while position!=0:
            self.probe=self.probe.next
        self.probe.data=data_changeby
    def insert_after(self,insert_position,insert_data):#无法执行???
        new_node=Node_new_single(insert_data,None)
        self.probe=self.head
        i=1
        if insert_position==len(self):
            while self.probe.next!=None:
                self.probe=self.probe.next
            self.probe.next=new_node
        elif insert_position>len(self) or insert_position<1:
            raise PositionError
        else:
            self.probe=self.head #????????????为什么加了这个就可以运行了???????
            while self.probe.next!=None and i!=insert_position:
                i+=1
                self.probe=self.probe.next
            new_node.next=self.probe.next
            self.probe.next = new_node
    def insert_before(self,insert_position,insert_data):
        if insert_position==1:
            self.head = Node_new_single(insert_data, self.head)
        elif insert_position>len(self) or insert_position<1:
            raise PositionError
        else:
            self.probe=self.head
            i=1
            new_node = Node_new_single(insert_data, None)
            while i!=insert_position-1 and self.probe.next!=None:
                self.probe=self.probe.next
                i+=1
            new_node.next = self.probe.next
            self.probe.next = new_node
    def append(self,append_data):
        self.probe=self.head
        while self.probe.next!=None:
            self.probe=self.probe.next
        new_node = Node_new_single(append_data, None)
        self.probe.next=new_node
    def __repr__(self):
        return 'length:'+str(len(self))+'\nlink_dataList: '+str(self.throught())


#part two 双链表
class Node_new_double():
    def __init__(self,data,next,before):
        self.data=data
        self.next=next
        self.before=before
class Double_link():
    def __init__(self,list=[]):
        if list==[]:
            self.head=Node_new_double(None,None,None)
        else:
            self.position=-1
            self.head=Node_new_double(list[self.position],None,None)
            self.position-=1
            self.end=self.head
            self.store=self.end #用于储存前一个节点对象
            self.probe_helper=self.end   #用于调用指针
            while True:
                try:
                    self.head = Node_new_double(list[self.position], self.head, None)
                    self.probe_helper=self.head
                    self.store.before=self.probe_helper
                    self.store=self.head
                    self.position-=1
                except:
                    break
    def throught(self):
        self.list=[]
        self.probe=self.head  #初始化指针
        while self.probe!=None:
            self.list.append(self.probe.data)
            self.probe=self.probe.next
        return self.list
    def __len__(self):
        self.i=0
        self.probe=self.head
        while self.probe!=None:
            self.i+=1
            self.probe=self.probe.next
        return self.i
    def delete(self,delete_data):
        self.probe = self.head
        if self.probe.data==delete_data:
            self.head=self.head.next
            self.head.before=None
            self.delete(delete_data)
        else:
            while self.probe.next != None:  #如果不是最后一个元素的话
                if self.probe.next.data==delete_data:  #如果下一个元素为目标
                    if self.probe.next.next==None:    #如果下一个元素为最后一个
                        self.probe.next=None
                        self.end=self.probe
                    else:
                        self.probe.next=self.probe.next.next
                        self.probe.next.next.before=self.probe
                else:
                    self.probe=self.probe.next
    def change_by_value(self,data_changeby,*args):
        self.probe = self.head
        while self.probe!=None:
            if self.probe.data in args:
                self.probe.data=data_changeby
            self.probe=self.probe.next
    def change_by_position(self,data_changeby,position):
        if position>len(self) or position<1:
            raise ValueError
        self.probe = self.head
        position-=1
        while position!=0:
            self.probe=self.probe.next
        self.probe.data=data_changeby


    def append(self,append_data):
        self.probe=self.end   #初始化指针
        self.end=Node_new_double(append_data,None,self.probe)
        self.probe.next=self.end
    def head_append(self,append_data):
        self.probe=self.head #初始化指针
        self.head=Node_new_double(append_data,self.head,None)
        self.probe.before=self.head
    def __repr__(self):
        return 'length:' + str(len(self)) + '\nlink_dataList: ' + str(self.throught())
        #by 不吃香菜的大头怪 19/1/24
       

好的 今天就写这么多 具体类方法不说了(根据命名猜猜用法就行了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值