Pythonでの単方向リストの実装

投稿者: Anonymous

Pythonを用いてリストを実装しようとしています。
Linked List のようにして実装しています。

以下のコードの「ここ!!」とした部分ですが、なぜreturnする必要があるのでしょうか。self.headにnew_nodeが入ってif文は終わりなのではないでしょうか。
試しにreturnを消してみると、プログラムが止まらず、同関数内のwhileから抜けられていないことがわかりました。
returnは特に何も返していないと思うのですが、なぜループから抜けられなくなるか疑問です。

またprintList内のwhileですが、tempがNoneではない場合とはtemp.dataまたはtemp.nextのいずれかがNoneではないという理解で良いでしょうか。

よろしくおねがいします。

# Node class 
class Node: 
  
    # Function to initialize the node object 
    def __init__(self, data): 
        self.data = data  # Assign data 
        self.next = None  # Initialize next as null 
  
# Linked List class 
class LinkedList: 
    
    def __init__(self):  
        self.head = None

    def append(self, new_data): 
       new_node = Node(new_data) 

       if self.head is None: 
            self.head = new_node 
            return  # <-----ここ!!
 
       last = self.head 
       while last.next: 
           last = last.next
 
       last.next =  new_node 


    def printList(self): 
        temp = self.head 
        while temp: 
            print(temp.data) 
            temp = temp.next

解決

以下のコードの「ここ!!」とした部分ですが、なぜreturnする必要があるのでしょうか。

それは2つの処理の塊が排他的な条件で(どちらかだけ)実行されるべきものだからでしょう。

headNoneの時に行う処理:空のheadに1つのnew_nodeをリンクする

if self.head is None: 
    self.head = new_node 
    return  <-----ここ!!

headNone以外の時に行う処理:リンクをたどっていって、最後に1つのnew_nodeをリンクする

last = self.head 
while last.next: 
   last = last.next

last.next =  new_node 

上記のreturnを削除すると、両方の処理が実行されることになり、最初のappendが済むとheadにリンクされたノードのnextlast.next = new_nodeによって自分自身を指すことになります。
その後2つ目のappendを行おうとすると無限ループになります。

こちらの記事の方が分かりやすいかもしれませんね:
連結リスト(Linked List)を大学生が解説してみた by python

それぞれの処理をif:else:で分けています。
こちらの記事もif:の方にreturnが入っていますが、こちらのreturnは削除しても動作します。


またprintList内のwhileですが、tempがNoneではない場合とはtemp.dataまたはtemp.nextのいずれかがNoneではないという理解で良いでしょうか。

これは違います。

tempNoneではない場合とはheadまたはtemp.nextNoneではないということです。
temp.dataは何であっても構いません。


コメント対応追記:

「while文がtemp.nextのみを見る」のは、このメソッドが「リンクの末尾に指定された値を持つノードを追加する」だけのものだからです。
この時必要なのは、「next」の値だけです。

これが例えば「オブジェクトが合計値や平均値という属性を持って」いて、「ノードを追加すると自動的にそれらを計算しなおす」といった機能を持っているならば、ノード追加の処理中にそれぞれのノードの「data」を読み取って何かの処理を行うステップが追加されます。


コメント対応追記その2:

「while temp:」のところで判断の元になっているのは、tempFalseで無い(プログラム上はTrueと同じ扱いであるNodeクラスインスタンスのアドレスか、またはFalseと同じ扱いであるNone)かどうかであって、その中身が何でどうなっているか、については関係ありません。

「while temp:」の時点ではtempFalseでは無い何かの数値/文字列/オブジェクトであってもループは実行されるでしょう。
もちろん、Nodeクラスインスタンスのアドレスでなければ、その下のwhileループ内の処理でエラーになって終了しますが。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *