Python
 Computer >> コンピューター >  >> プログラミング >> Python

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 をたどりながらカウントを増やしていき、nodeNone になった時点でのカウント値、すなわちリスト全体の長さを返します。このように、ポインタを一つずつ進めるシンプルな走査によって、連結リストの長さを効率的に求めることができます。

  1. 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:

  2. 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 の場合、出