链表

无须再内存中顺序存储,即可保持数据之间的逻辑关系的数据结构

相比数组,链表执行插入、删除等操作效率大大提高

非顺序存储,删除和插入与长度无关,只需改变指针域,时间复杂度O(1)

链表的基本结构

#链表:由一个个节点(Node)连接而成

#节点:由数据域(Data)和指针域(Next)构成

#数据域:存储一般是整型、浮点型等数字类型 #指针域:存储下一个节点所在内存单元地址

#单链表:每个节点的指针域只指向下一个节点

#双向链表:每个节点的指针域分为前向指针和后向指针

#单向循环链表:尾节点指针域指向头节点,链表中存在环

链表的实现和操作

创建节点

class Node:
    #创建节点
    #两个属性,数据域和指针域
    def __init__(self,data):
        self.data=data #数据域
        self.next=None #指针域
        return
    #一个方法:判断链内是否存在某一值的节点
    def has_value(self,value):
        if self.data==value:
            return True
        else:
            return False
#定义一个值为1的新节点
# node1=Node(1)

创建单链表

class singlelink:
    #3个属性,头节点、尾节点、链表长度
    def __init__(self):
        self.head=None
        self.tail=None
        self.length=0
        return
    #方法
    def isempty(self):
        """
        判断列表是否为空
        :return:
        """
        return self.length==0

    def add_node(self,item):
        """
        向链表结尾添加节点
        :param item:
        :return:
        """
        if not isinstance(item,Node):
            #判断是否为实例
            #isinstance Return whether an object is an instance of a class or of a subclass thereof.
            item=Node(item)

        if self.head is None:
            self.head=item
            self.tail=self.head
        else:
            self.tail.next=item
            self.tail=item
          
        
        self.length+=1
        return item

    def find_node(self,value):
        '''
        通过数值查找链表中的所有符合数值的节点位置
        '''
        current_node=self.head
        node_id=1
        result=[]
        while current_node is not None:
            if current_node.has_value(value):
                result.append(node_id)
            node_id+=1
            current_node=current_node.next
        return result

    def print_Slink(self):
        '''
        按顺序输出链表
        '''
        current_node=self.head
        while current_node is not None:
            print(current_node.data)
            current_node=current_node.next

    def insert_node(self,index,data):    
        """
        向链表插入节点
        :param index: 插入位置
        :param data:插入数据
            
        """                                                                     
        if self.isempty():
            print("this link is empty")
            return
        if index <0 or index>=self.length:
            print("error: out of index")
            return
        item =Node(data)
        if index==0:
            item.next=self.head
            self.head=item
            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 delete_item_byid(self,item_id):
        '''
        通过索引删除节点

        '''
        prev=self.head
        node=self.head
        if item_id==0:
            self.head=node.next
            return node.data
        j=0
        while node.next and j<item_id:
            
            prev=node
            node=node.next
            
            j+=1
        if j==item_id:
            prev.next=node.next
            self.length-=1
        return node.data
sl=singlelink()
sl.add_node(Node(1))
sl.add_node(Node(2))
sl.add_node(Node(3))
sl.add_node(2)
sl.insert_node(1,5)
print(sl.delete_item_byid(3))
sl.print_Slink()
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-01 13:13
ecece:这么明目张胆虚报就业率啊
点赞 评论 收藏
分享
没有offer的呆呆:薪资有的时候也能说明一些问题,太少了活不活得下去是一方面,感觉学习也有限
点赞 评论 收藏
分享
06-03 15:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务