2016-09-23 50 views
0

当前的代码,我试图做一个链表,然后按升序对链表进行排序。AttributeError:'NoneType'对象没有属性'data'链接列表

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() 

目前得到的错误

File "python", line 25, in File "python", line 16, in insertNode AttributeError: 'NoneType' object has no attribute 'data'

我真的很新的Python和努力得到这个工作,有什么建议?

+1

不要重新发明轮子,看看[Python的链表的问题(HTTP ://stackoverflow.com/questions/280243/python-linked-list),它更清洁。 –

+0

请注意,根据您的使用情况(如果有的话),使用[python的'deque'](https://docs.python.org/3/library/collections.html#collections.deque)可能更多实际 - 它们[以链接列表的形式实现](http://stackoverflow.com/a/6257048/5349916)。 – MisterMiyagi

回答

1

虽然你发布代码和错误行不太匹配,这个问题很可能在这里:

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

当你检查current_nodeNone,你从来没有检查current_node.nextNone无论是。

还有一些其他的错误,例如, 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)