如何在Python中打印链表而不出现None错误

问题描述 投票:0回答:1

我正在构建一个简单的链表,我可以按相反的顺序打印它(添加的第一个节点最后打印),但我想按正常顺序打印它。但是我不确定为什么我总是收到无法打印 None 的错误。

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None
  def addNextData(self, data):
    self.next = Node(data)
    return self.next
  def __str__(self):
    if(self is None):
      return "None"
    print(self.data)
    return print(self.next)

node = Node("a")
node.addNextData("b") \
  .addNextData("c") \
  .addNextData("d")
print(node)


Traceback (most recent call last):
TypeError: __str__ returned non-string (type NoneType)

我已经采取了这样的做法,但它打印了不必要的空白字符串/行:

  def __str__(self):
    if(self is None):
      return "None"
    print(self.data)
    print(self.next)
    return ""

我能够迭代地执行此操作,但也许有一种更优雅的方法可以通过打印/递归来执行此操作:

  def __str__(self):
    head = self
    str = ''
    while(head is not None):
      str = str + head.data  + '->'
      head = head.next
    return str + 'None'
      

我很难理解为什么这个(逆序打印)不会抛出 None 错误。 :

def __str__(self):
    print(self.next)
    return self.dat

也很困惑,因为 print(None) 不会抛出错误。

python-3.x linked-list
1个回答
1
投票

您不想从

__str__
方法打印任何内容 - 它应该只返回
str
print
是一个打印字符串但不返回任何内容的函数,因此
return print(...)
相当于
print(None)
。这就是您的
TypeError: __str__ returned non-string (type NoneType)
错误的原因。

if(self is None):
      return "None"

也是一个无操作,因为

self
永远不会*成为
None
,因为它(根据定义)是您的
Node
类型的实例。

在你的情况下,你可以做类似的事情

class Node:
  def __init__(self, data):
    self.data = data
    self.next = None
  def addNextData(self, data):
    self.next = Node(data)
    return self.next
  def __str__(self):
    if self.next is not None:
        return str(self.data) + ", " + str(self.next)
    else:
        return str(self.data)

node = Node("a")
node.addNextData("b") \
  .addNextData("c") \
  .addNextData("d")
print(node)

* 永远不要,除非你故意用

None
直接调用它,例如(
Node.__str__(None)
)

© www.soinside.com 2019 - 2024. All rights reserved.