🪢

【Python】Optional[ListNode]とLinked Listをわかりやすく解説!

に公開

初めに

Pythonでデータ構造を学ぶ際に、連結リスト(Linked List)は避けて通れません。この記事では、連結リストの基本と、Optional[ListNode] という型ヒントについて、分かりやすく解説します!

linked list(連結リスト)とは?

連結リストは、データ(ノード)が次のノードを指す形でつながっているデータ構造です。
例えば,1→2→3→4というデータを連結リストで表すと以下のようになります。

Python で表現すると、各ノードは ListNode というクラスで作られることが多いです。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val  # ノードの値
        self.next = next  # 次のノードへの参照

# 連結リストの作成例
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)

node1.next = node2
node2.next = node3
node3.next = node4

# 連結リストの値を表示する関数(4で終了)
def print_linked_list_to_4(head):
    current = head
    while current:
        print(current.val, end=" -> ")
        if current.val == 4:
            break  # 4が出たらループを終了
        current = current.next
    print("End")  # 終了を示す"End"を表示

# 連結リストの値を表示
print_linked_list_to_4(node1)

出力
1 -> 2 -> 3 -> 4 -> End

Optional[ListNode]とは?

Pythonでは、関数の引数や戻り値に型ヒントをつけることで、コードの可読性や保守性を向上させることができます。Optional[ListNode] とは、「ListNode型のオブジェクト、または None を取る可能性がある」 ことを示します。つまり、None を許容することを意味します。

Optional[ListNode]を使ってみる。

from typing import Optional

class ListNode:
    def __init__(self, val: int = 0, next: Optional["ListNode"] = None):
        self.val = val  # ノードの値
        self.next = next  # 次のノードへの参照

# 連結リストの作成例
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)

node1.next = node2
node2.next = node3
node3.next = node4

# 連結リストの値を表示する関数(4で終了)
def print_linked_list_to_4(head: Optional[ListNode]) -> None:
    current: Optional[ListNode] = head
    while current:
        print(current.val, end=" -> ")
        if current.val == 4:
            break  # 4が出たらループを終了
        current = current.next
    print("End")  # 終了を示す"End"を表示

# 連結リストの値を表示
print_linked_list_to_4(node1)

Optional[ListNode]を使用するメリット

  • 他の人がコードを読んだときに、「ここは None も入るんだな」とすぐに理解できる。
  • コードの可読性が向上する
  • None を考慮しないバグを減らせる

Discussion