1. [1,2,3] -> 3 (3 ノード)
  2. 単一ノード [42] -> 1
  3. 5 ノードのリスト
  4. 値に 0 が含まれる
  5. 値に負数が含まれる
  6. 10 ノード
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
リンクリスト構築と長さの計算

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

リンクリスト構築と長さの計算

配列の途中に 1 件差し込むと、後ろの要素はすべて 1 つずつ後ろへずれます。先頭に差し込めば、全件が動きます。この「ずらす」をやめるために作られた形が連結リストです。

途中に 1 件足すたび、後ろが全部ずれる

配列は箱が隙間なく並んでいるので、割り込むには後ろを動かすしかありません。連結リストは箱をばらばらの場所に置き、それぞれが「次はどこにあるか」という札を持ちます。割り込みたいときは札を 2 枚書き換えるだけで、他の箱は 1 つも動きません。

代わりに失うものもあります。

操作配列連結リスト
100 番目を見るすぐ届く先頭から 100 回たどる
先頭に差し込む全件ずらす札を 2 枚書き換える
1 件あたりの容量値だけ値と札

ノードは「中身」と「次はどこか」の 2 つを持つ

連結リストの 1 単位をノードと呼びます。持ち物は 2 つだけです。

Python

class Node: def __init__(self, value): self.value = value self.next = None

JavaScript

class Node { constructor(value) { this.value = value; this.next = null; } }

next の初期値が空なのが大事です。空は「この先はもう無い」という末尾の印になります。

末尾を探すのに、毎回先頭から歩くことになる

再生キューを思い浮かべてください。曲を 1 曲足すには、末尾のノードの next に新しいノードをつなぎます。ところが末尾がどこかは、先頭から札をたどらないと分かりません。

Python

cur = head while cur.next is not None: cur = cur.next print(cur.value) # 最後の曲

1 曲足すたびにこれをやると、曲数が増えるほど遅くなります。だから組み立てる側は、末尾のノードを覚えておく変数をもう 1 つ持ちます。新しいノードをつないだら、その変数も新しいノードへ移してください。移し忘れると、同じノードの next を何度も上書きすることになり、つないだはずの 2 個目以降が消えます。

もう 1 つ、先頭のノードを指す変数は絶対に動かさないでください。歩くときは作業用の変数を別に用意します。先頭を進めてしまうと、そこより前のノードを指す札がどこにも無くなり、リストごと行方不明になります。歩き終わったあとに先頭へ戻れないのが、連結リストの怖いところです。

先頭が空のときは、上の while が 1 度も回りません。空のリストは長さ 0 で、たどる相手がいない状態です。逆に中身が n 件あれば、末尾に着くまでに必ず n 回たどることになります。配列の要素数がその場で分かるのとは対照的です。

今回の課題では、この歩き方をしながら通ったノードの数を数えます。配列の要素数をそのまま返してしまうと、たどる練習になりません。

要件

  1. 内部で Node オブジェクト (value + next) を組み立てること
  2. head から next ポインタを辿ってノード数を数えること
  3. arr.length / len(arr) を直接返さないこと (走査が前提)

入出力例

listLength([1,2,3]) → 3 listLength([42]) → 1 listLength([5,6,7,8,9]) → 5 listLength([0,0,0,0]) → 4 listLength([-1,-2,-3]) → 3 listLength([1,2,3,4,5,6,7,8,9,10]) → 10

ヒント

buildList(arr) を別関数に分けると見通しが良くなる

tail = head から始め、新しい Node を作るたびに tail.next = new, tail = tail.next と更新する

走査は cur = head; while cur is not None: count += 1; cur = cur.next の型がきれい

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • リンクリストの反転

    配列で表現された連結リストを反転させ、ポインタ付け替えのアルゴリズムを身につける。

  • リンクリストのサイクル検出

    Floyd の Tortoise and Hare アルゴリズムを使って連結リストのサイクル有無を判定する。

  • ソート済みリンクリストの merge

    ソート済みの 2 つの連結リストを 1 つにマージし、merge sort の核となる手法を理解する。

  • リンクリストの中央ノード取得

    slow / fast の 2 ポインタ法を使って連結リストの中央ノードの値を一発で取得する。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • 連結リスト各要素が次の要素へのポインタを持つ構造。
  • リスト順序付きで複数の値を扱うデータ構造
  • キュー先入れ先出し(FIFO)のデータ構造
  • 変数データに名前をつけて参照する仕組み
  • 素数1 と自分自身でしか割り切れない自然数
  • オブジェクトキーと値のペアで構造を作るデータ
main.py
学習モード
エディタを読み込んでいます

メモ

リンクリスト構築と長さの計算

⌘S で保存