线性表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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗