单链表结构与顺序存储结构的优缺点:从存储分配方式上看,单链表采用链式存储结构,用一组任意的存储单元来存放线性表的元素;而顺序存储结构则用一段连续的存储单元依次存储线性表的数据元素。从时间性能上看,查找:顺序存储结构O(1),单链表O(n);插入和删除上看,顺序存储结构需要平均移动一半的元素,即O(n),而单链表则O(1)。空间性能方面:顺序存储结构需要预分配存储结构,分大了,容易浪费空间资源;而单链表不需要预分配,元素个数也不受限制,自由度大。
链表的实现方式:#Node的初始化
class Node(object):
def __init__(self,data,next=None):
self.data=data
self.next=next
#用来定义Node的字符输出,print为输出data
def __repr__(self):
return str(self.data)
#NoneList的初始化
class NodeList(object):
def __init__(self):
self.length=0
self.head=None
#判断该链表是否为空
def is_empty(self):
return self.length==0
#增加一个节点(在链表末尾添加)
def append(self,dataOrNode):
item=None
if isinstance(dataOrNode,Node):
item=dataOrNode
else:
item=Node(dataOrNode)
if not self.head:
self.head=item
self.length+=1
else:
node=self.head
while node.next:
node=node.next
node.next=item
self.length+=1
#删除一个节点
def delete(self,index):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index" )
if index==0:
self.head=self.head.next
self.length-=1
return
j=0
node=self.head
prev=self.head
while node.next and j<index:
prev=node
node=node.next
j+=1
if j==index:
prev.next=node.next
self.length-=1
#修改一个节点
def update(self,index,data):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index" )
j=0
node=self.head
while node.next and j<index:
node=node.next
j+=1
if j==index:
node.data=data
#查找一个节点
def getItems(self,index):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index" )
j=0
node=self.head
while node.next and j<index:
node=node.next
j+=1
return node.data
#查找一个节点的索引
def getIndex(self,data):
j=0
if self.is_empty():
print ("The chain table is empty.")
return
node=self.head
while node:
if node.data==data:
return j
node=node.next
j+=1
if j==self.length:
print ("%s not found"%(str(data)))
return
#插入一个节点
def insert(self,index,dataOrNode):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index")
return
item=None
if isinstance(dataOrNode,Node):
item=dataOrNode
else:
item=Node(dataOrNode)
if index==0:
item.next=self.head
self.length+=1
return
j=0
node=self.head
prev=self.head
while node.next and j<index:
prev=node
node=node.next
j+=1
if j==index:
item.next=node
prev.next=item
self.length+=1
#清空链表
def clearList(self):
self.head=None
self.length=0
#整表输出
def __repr__(self):
if self.is_empty():
return "empty chain table"
node=self.head
nlist=''
while node:
nlist+=str(node.data)+' '
node=node.next
return nlist
#查看一个节点的索引
def __getitem__(self,index):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index")
return
return self.getItems(index)
#修改一个节点
def __setitem__(self,index,value):
if self.is_empty():
print ("The chain table is empty.")
return
if index<0 or index>self.length:
print ("error:out of index" )
return
self.update(index,value)
#测试链表的长度
def __len__(self):
return self.length