python单链表的实现

单链表结构与顺序存储结构的优缺点:从存储分配方式上看,单链表采用链式存储结构,用一组任意的存储单元来存放线性表的元素;而顺序存储结构则用一段连续的存储单元依次存储线性表的数据元素。从时间性能上看,查找:顺序存储结构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


                             
                        
                             
    
    


            
        


            


            
        





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值