qq_41967699 2018-11-05 09:48 采纳率: 0%
浏览 494

python单链表问题,有个问题怎么改?

代码如下
class Node(object): #首先创建一个单链表,需要value域,和一个next指针域
def init(self,value=None,next=None):
self.value,self.next = value,next
class LinkList(object): #创建链表
def init(self,maxsize=None): #,该函数是初始化这个链表,让maxsize=None,意思是这个链表可以无限长
self.maxsize=maxsize
self.root=Node() #根结点只是起到入口的作用,不能存放东西,所以让它为空结点
self.length=0
self.tailnode=None
def len(self): #返回长度
return self.length
def append(self,value): #添加结点(尾插法)
if self.maxsize is not None and len(self)>self.maxsize: #判断是否超限,如果超限则抛出一个异常
raise Exception('Full')
node = Node(value)
tailnode= self.tailnode
if tailnode is None:
self.root.next=node
else:
tailnode.next=node
self.tailnode=node
self.length+=1
def appendleft(self,value): #添加结点(头插法)
headnode=self.root.next
node=Node(value)
self.root.next=node
node.next=headnode
self.length+=1
def iter_node(self): #遍历整个链表
curnode = self.root.next
while curnode is not self.tailnode:
yield curnode
curnode = curnode.next
yield curnode
def iter(self): #遍历并输出
for node in self.iter_node():
yield node.value
def remove(self,value): #O(n) 因为不能像顺序结构直接通过下标来访问结点,所以时间复杂度是n
prevnode =self.root #负责记住前一个结点
curnode=self.root.next
for curnode in self.iter_node():
if curnode.value==value:
prevnode.next=curnode.next
del curnode
self.length-=1
return 1
else:
prevnode=curnode
return -1
def find(self,value): #O(n) 寻找链表中某一个元素的位置,若没有该元素,则返回-1
index=0
for node in self.iter_node():
if node.value==value:
return index
index+=1
return -1
def popleft(self): #O(1),弹出第一个元素
if self.root.next is None:
raise Exception('pop from empty Linklist')
headnode = self.root.next
value=headnode.value
self.length-=1
del headnode
return value
def clear(self):#清除整个链表
for node in self.iter_node():
del node
self.root.next=None
self.length=0
if name == '__main__':
ll=LinkList()
ll.append(0)
ll.append(1)
ll.append(2)
assert len(ll)==3
assert ll.find(2)==2
assert ll.find(3)==-1
ll.remove(0)
assert len(ll)==2
assert ll.find(0)==-1
assert list(ll)==[1,2]
ll.appendleft(0)
assert list(ll)==[0,1,2]
assert len(ll)==3
handvalue=ll.popleft()
assert handvalue==0
assert len(ll)==2
print(list(ll))
ll.clear()
assert len(ll)==0
我想用popleft删除第一个元素,代码执行到print(list(ll)),却输出[0,1,2],有没有大神帮忙看一下

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2018-11-06 16:18
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题