Pythonで連結リスト(リンクリスト)の長さを求める方法
単方向連結リスト(片方向リンクリスト)が与えられたとき、その長さ(ノード数)を求めることを考えます。この連結リストは、next(次のノードへの参照)と val(ノードが保持する値)というフィールドを持っています。
例えば、入力が [2 -> 4 -> 5 -> 7 -> 8 -> 9 -> 3] のような連結リストである場合、ノードは7個あるため、出力は 7 となります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- カウンタ変数
countを 0 で初期化する - 現在のノードが null(None)でない限り、以下を繰り返す
countを 1 増やす- 現在のノードを次のノード(
node.next)に移動する
- ループ終了後、
countを返す
このアルゴリズムの計算量は O(n) です。リスト内のすべてのノードを一度だけ走査するため、時間計算量はノード数に比例し、空間計算量は O(1)(追加のメモリ不要)となります。
実装例
それでは、実際のコード実装を見てみましょう。
class ListNode:
def __init__(self, data, next = None):
self.val = data
self.next = next
def make_list(elements):
head = ListNode(elements[0])
for element in elements[1:]:
ptr = head
while ptr.next:
ptr = ptr.next
ptr.next = ListNode(element)
return head
class Solution:
def solve(self, node):
count = 0
while node:
count += 1
node = node.next
return count
ob = Solution()
head = make_list([2,4,5,7,8,9,3])
print(ob.solve(head))
入力
[2,4,5,7,8,9,3]
出力
7
コードの解説
ListNode クラスは連結リストの各ノードを表し、コンストラクタで値(val)と次ノードへの参照(next)を受け取ります。make_list 関数は Python のリストから連結リストを構築する補助関数です。
核心となるのは Solution クラスの solve メソッドです。先頭ノードから順に next をたどりながらカウントを増やしていき、node が None になった時点でのカウント値、すなわちリスト全体の長さを返します。このように、ポインタを一つずつ進めるシンプルな走査によって、連結リストの長さを効率的に求めることができます。
-
Pythonで特定の長さ(K)の行を除外する方法
リストの中から、特定の長さ(K)を持つ行を除外したい場合、シンプルな反復処理(forループ)と len() 関数、append() メソッドを組み合わせることで簡単に実現できます。 サンプルコード 以下に具体的な実装例を示します。 my_list = [[41, 7], [8, 10, 12, 8], [10, 11], [6, 82, 10]] print(The list is :) print(my_list) my_k = 2 print(The value of K is ) print(my_k) my_result = [] for row in my_list:
-
Pythonで連結リストのm個のノードを保持した後にn個のノードを削除するプログラム
始点ノードが「head」である連結リストと、2つの整数 m と n が与えられたとします。リストを走査しながら、先頭から数えて m 個のノードを残した直後の n 個のノードを削除する処理を、連結リストの末尾に到達するまで繰り返します。処理は head ノードから開始し、最後に変更後の連結リストを返します。今回扱う連結リストの構造は次のように定義されています。Node value : <整数値> next : <次のノードへのポインタ>例えば、入力が elements = [1, 2, 3, 4, 5, 6, 7, 8]、m = 3、n = 1 の場合、出