顺序表需要有连续的空间,相对便于查找,但对数据的处理较为不便。
引入链表
链表存储空间可以不连续,通过链接/指针 指向下一个数据的地址。
链表的一个节点由数据和链接两部分组成。
链表特征:储存了根节点的地址,按顺序有向一个指向下一个
节点操作:
__init__(self,d,n=None) 初始化
get_next(self) 获取下一个节点
set_next(self,n) 设置下一个节点
get_data(self) 获取数据
set_data(self,d) 设置数据
has_next(self) 判断下一个数据
to_string(self) 以字符串打印
链表操作:
__init__(self,r=None) 初始化
get_size(self) 返回长度,多少个节点
add(self,d) 加入数据,创建一个节点指向原来的根节点,作为新根
add_node(self,n) 加入节点,放在最前面,指针指向原根节点。
remove(self,d) 删除一个节点 文字伪代码:赋值当前节点为根节点
赋值先前节点为空
当前节点不为空,判断是不是要找的值
是 将先前节点的指针指向下一节点
否 查找下一节点
若没有要找的值,报错
python代码实现
#coding=utf-8
class Node(object):
def __init__(self,d,n=None):
self.data=d
self.next_node=n
def get_next(self):
return self.next_node
def set_next(self,n):
self.next_node=n
def get_data(self):
return self.data
def set_data(self,d):
self.data=d
def has_next(self):
if self.get_next() is None:
return False
return True
def to_string(self):
return 'Node value:'+str(self.data)
class LinkedList(object):
def __init__(self,r=None):
self.root=r
self.size=0
def get_size(self):
return self.size
def add(self,d):
new_node=Node(d,self.root)
self.root=new_node
self.size += 1
def add_node(self,n): #加入一个节点,区别是已有指针
n.set_next(self.root)
self.root=n
self.size += 1
def remove(self,d):
this_node=self.root
prev_node=None
while this_node is not None:
if this_node.get_data() == d:
if prev_node is not None: #不是根节点
prev_node.set_next(this_node.get_next())
else: #是根节点
self.root=this_node.get_next()
self.size -=1
return True # data removed
else: #看下一个是不是
prev_node=this_node
this_node=this_node.get_next()
return False # data not found
def find(self,d):
this_node = self.root
while this_node is not None:
if this_node.get_data() == d:
return d
elif this_node.get_next() == None:
return False
else:
this_node=this_node.get_next()
def print_list(self):
print('print list.....')
if self.root is None:
return #根节点为空,返回空
this_node=self.root
print(this_node.to_string())
while this_node.has_next():
this_node=this_node.get_next()
print(this_node.to_string())
def sort(self):
if self.size>1:
newlist=[]
current=self.root
newlist.append(self.root)
while current.has_next():
current=current.get_next()
newlist.append(current)
newlist=sorted(newlist,key=lambda node:node.get_data(),reverse=True)
newll=LinkedList()
for node in newlist:
newll.add_node(node)
return newll
return self