73243


Pythonを用いてリストを実装しようとしています。  
[Linked List](https://www.geeksforgeeks.org/linked-list-set-2-inserting-a-
node/) のようにして実装しています。

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

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

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

[code]

    # 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
    
[/code]


CC BY-SA 4.0
2021-01-12T05:26:16.130
73241
2021-01-14T13:10:17.950
2021-01-12T06:42:41.280
3060
30396
question
python python3 アルゴリズム
Pythonでの単方向リストの実装


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

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

`head`が`None`の時に行う処理：空の`head`に1つの`new_node`をリンクする

[code]

    if self.head is None: 
        self.head = new_node 
        return　　<-----ここ！！
    
[/code]

`head`が`None`以外の時に行う処理：リンクをたどっていって、最後に1つの`new_node`をリンクする

[code]

    last = self.head 
    while last.next: 
       last = last.next
    
    last.next =  new_node 
    
[/code]

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

こちらの記事の方が分かりやすいかもしれませんね：  
[連結リスト（Linked List）を大学生が解説してみた by
python](https://astrostory.hatenablog.com/entry/2020/02/24/070213)

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

* * *

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

これは違います。

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

* * *

**コメント対応追記：**

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

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

* * *

**コメント対応追記その２：**

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

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


CC BY-SA 4.0
2021-01-12T07:03:45.143
73243
2021-01-14T13:10:17.950
2021-01-14T13:10:17.950
26370
26370
73241
answer