线性表List

数组array是基本的数据结构,但它的功能有限,线性表list可以认为是扩展了功能的数组。可以自动调整大小。添加和删除元素不需要其他元素移位。

根据指针数量和指向的不同,线性表分为单向链表、双向链表和循环链表。

一、单向链表

单项链表有一个头指针,指向链表的第一个元素,除最后一个元素外,其它元素都有一个指针指向其后的元素。如图:

这种结构简单有效,可以非常方便的对链表进行遍历、查询、添加和删除元素。

复制代码
class ListNode:
    def __init__(self,data):
        self.data=data
        self.next=None
        
class LinkList :
    def __init__( self ):
        self.head = None
        self._size = 0
    def is_empty(self):
        return self.head is None
    def __len__( self ):
        return self._size
    def __contains__( self, target ):
        curNode = self.head
        while curNode is not None and curNode.data != target :
            curNode = curNode.next
        return curNode is not None
    def search(self,target):
        curNode =self.head
        while curNode is not None and curNode.data !=target:
            curNode=curNode.next
        return curNode is not None
    def pre_add(self,data ):
        newNode = ListNode(data )
        newNode.next = self.head
        self.head = newNode
        self._size += 1
    def append(self,data):
        newNode=ListNode(data)        
        if self.head is None:
            self.head=newNode
            self._size+=1
            return 
        curNode=self.head
        while curNode.next is not None:
            curNode=curNode.next
        curNode.next=newNode
        self._size+=1
    def pre_del(self):
        if self.head is None:
            return 
        curNode=self.head
        print curNode.data
        self.head=curNode.next
    def pop(self):
        if self.head is None:
            return
        preNode=None
        curNode=self.head
        while curNode.next is not None:
            preNode=curNode
            curNode=curNode.next
        if curNode is self.head:
            print curNode.data
            self.head=None
            self._size-=1
        else:
            print curNode.data
            preNode.next=curNode.next
            self._size -=1    
        
    def travel(self,head):
        curNode=self.head
        while curNode is not None:
            print curNode.data
            curNode=curNode.next
    def remove( self, data ):
        predNode = None
        curNode = self.head
        while curNode is not None and curNode.data != data :
            predNode = curNode
            curNode = curNode.next

        self._size -= -1
        if curNode is self.head :
            self.head = curNode.next
        else :
            predNode.next = curNode.next
        return curNode.data

        
if __name__=='__main__':        
    test=LinkList()
    for i in range(10):
        test.append(i)
    test.pop()
    test.pop()
    print '*********************'
    test.pre_del()
    test.pre_del()
    print '*********************'
    print test.remove(4)
    print test.remove(5)
    print '*********************'
    test.travel(test.head)
    print test.search(5)
复制代码

 

posted @   Mars.wang  阅读(355)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示