2016-09-23 8 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() 

は現在、任意の提案を、私は、Pythonには本当に新しいですエラー

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

を取得し、この作業を取得しようとしていますか?

+1

を(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の変更をサポートするために、あなたはこのようなリスト記入する必要があります:[Pythonのリンクリストの質問]を見て、車輪の再発明をしないでください

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) 
関連する問題