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
好的 今天就写这么多 具体类方法不说了(根据命名猜猜用法就行了)