展开全部
楼主你好!
看你的代码存在很多问题,一个个来说明
1)首先你代码的报错源于你想用list来展62616964757a686964616fe4b893e5b19e31333363356537开你的SLinkedList类,在python中,除非内置的可迭代对象外,其他都需要实现__iter__()函数,才能用list来进行展开。注意:判断一个对象是否可迭代,请使用isinstance(obj, Iterable)来判断obj是不是可以迭代,Iterable需要从collections中导入
2)插入的方法存在严重问题,按楼主的方法插入的话,因为头节点始终在变,所以当你需要遍历链表的时候就会找不到头节点;
3)pop的方法实现也有问题,因为是单向链,所以无法从末节点开始删除,只能删除头节点
4)top方法的意图未知
其他:
下面列举了一下我修改后的方案,做了一些锦上添花的操作,每个基本操作都会返回链表对象,这样就可以使用链式操作来写代码;迭代函数使用yield来实现,避免展开时占用不必要的内存。
另:我的展开时直接取链表中各个节点的元素,加了一些关键注释在代码中;# -*- coding: utf-8 -*-
class Node:
def __init__(self):
'''
elm:节点元素
nxt:下个节点指针
'''
self.elm, self.nxt = None, None
class SLinkedList:
def __init__(self):
'''
head: 链表头
end_point: 链表尾
'''
self.head = None
self.end_point = None
def push(self, x):
p = Node()
p.elm = x
if self.head is None:
self.head = p
self.end_point = p
return self
self.end_point.nxt = p
self.end_point = p
return self
def pop(self):
'''因为实现的是一个单链表,所以只能从头开始删除节点'''
if self.head.nxt is None:
return
self.head = self.head.nxt
return self
def __iter__(self):
temp_node = self.head
while temp_node is not None:
yield temp_node.elm
temp_node = temp_node.nxt
if __name__ == '__main__':
'''增加1,2,5三个元素,并删除一个头节点'''
mylinklist = SLinkedList().push(1).push(2).push(5).pop()
print(list(mylinklist))
其实python这个语言使用链表有些画蛇添足,但是如果拿来当作需求练手也无妨。
望采纳,谢谢!