🪢
【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