python画链表_python编程中实现linkedlist(链表)报错是因为什么,怎么解决?

展开全部

楼主你好!

看你的代码存在很多问题,一个个来说明

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这个语言使用链表有些画蛇添足,但是如果拿来当作需求练手也无妨。

望采纳,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值