AttributeError:'NoneType'对象没有属性'data'链接列表

时间:2016-09-23 06:18:13

标签: python

当前代码,我正在尝试创建一个链表,然后按升序对链表进行排序。

import random
random_nums = random.sample(range(100), 10)

class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = None
    def __str__(self):
        return str(self.data)

def insertNode(data, first_node):
  current_node = first_node
  while current_node !=None:
    if data > current_node.data and data <= current_node.next.data:
      new_node = Node(data, current_node.next)
      last_node.next = new_node
      print("Inserting node: " + str(data))

    current_node = current_node.next

first_node = Node(random_nums[0], None)
for i in random_nums[1:]:
  insertNode(i, first_node)

print("Linked list values:")
current_node = first_node
while current_node != None:
    print (str(current_node.data) + " => ", end="")
    current_node = current_node.next

input()

目前收到错误

  

文件“python”,第25行,in     在insertNode中输入“python”,第16行   AttributeError:'NoneType'对象没有属性'data'

我是python的新手,试图让这个工作,任何建议?

1 个答案:

答案 0 :(得分:1)

虽然您发布的代码和错误的行不完全匹配,但问题可能在这里:

    if data > current_node.data and data <= current_node.next.data:

当您检查current_node不是None时,您永远不会检查current_node.next是否也不是None

还有其他一些错误,例如last_node未定义,没有在前面插入的概念,并且您总是浏览整个列表。这应该更好:

def insertNode(data, first_node):
  current_node = first_node
  new_node = Node(data, current_node.next)
  if data <= current_node.data:
    # insert at start
    first_node = new_node
    new_node.next = first_node
  else:
    while current_node is not None:
      if current_node.next is None:
        # insert at end
        current_node.next = new_node
        break
      elif data > current_node.data and data <= current_node.next.data:
        # insert in-between current and next node
        new_node.next = current_node.next
        current_node.next = new_node
        break
      current_node = current_node.next
  print("Inserting node: " + str(data))
  return first_node  # must return first to avoid global variable!

要支持更改first_node,您必须填写以下列表:

rand_num_iter = iter(random_nums)  # avoids making a copy in [1:]
first_node = Node(next(rand_num_iter), None)
for i in rand_num_iter:
  first_node = insertNode(i, first_node)