JavaScriptの循環リンクリストとは?基本概念から実装方法までわかりやすく解説
循環リンクリスト(Circular Linked List)とは
循環リンクリストは、連結リスト(Linked List)の変形の一つです。通常の連結リストでは最後のノードが「null」を指して終端となりますが、循環リンクリストでは先頭の要素が末尾の要素を指し、末尾の要素が先頭の要素を指すという環状の構造を持っています。
この仕組みにより、リスト内のどのノードからでもすべての要素へアクセスでき、終端に到達しても処理が途切れることなくリスト全体を巡回し続けることが可能になります。
循環リンクリストの種類
単方向循環リンクリスト(Singly Circular Linked List)
各ノードが次のノードへの参照のみを持ち、最後のノードが先頭のノードを指す構造です。一方向にしか移動できませんが、実装がシンプルでメモリ効率に優れている点が魅力です。
双方向循環リンクリスト(Doubly Circular Linked List)
各ノードが前後両方のノードへの参照を持つ構造です。前方にも後方にも自由に移動できるため柔軟なデータ操作が可能ですが、その分メモリ消費量は増加します。
JavaScriptでのシンプルな実装例
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
class CircularLinkedList {
constructor() {
this.head = null;
}
// 末尾に要素を追加する
append(data) {
const newNode = new Node(data);
if (!this.head) {
this.head = newNode;
newNode.next = this.head; // 自分自身を指してループを作る
return;
}
let current = this.head;
while (current.next !== this.head) {
current = current.next;
}
current.next = newNode;
newNode.next = this.head;
}
}
循環リンクリストのメリットと主な活用例
- ラウンドロビン方式によるタスクスケジューリング
- 音楽プレーヤーのリピート再生機能
- マルチプレイヤーゲームにおけるターン制の管理
- バッファ管理などのシステムプログラミング
このように、循環的な処理が求められる場面で特に威力を発揮するデータ構造です。単方向・双方向のどちらの連結リストも、ポインタのつなぎ方を変えるだけで簡単に循環リンクリストとして応用できるため、アルゴリズム学習の題材としてもおすすめです。
-
C++で実装する双方向循環リンクリスト:アルゴリズムとサンプルコード徹底解説
循環リンクリストとは 循環リンクリスト(Circular Linked List)は、リンクリストの変形版であり、最初の要素が最後の要素を指し、最後の要素が最初の要素を指す構造を持つデータ構造です。片方向リンクリスト(Singly Linked List)でも双方向リンクリスト(Doubly Linked List)でも、循環リンクリストとして実装することができます。 双方向リンクリストの場合、末尾ノードのnextポインタが先頭ノードを指し、先頭ノードのprevポインタが末尾ノードを指すことで、両方向に循環する構造になります。 上図のように、押さえておくべき重要なポイントは以下の2点です。
-
C++で循環リンクリストのノード数をカウントする方法
ノードから構成される循環リンクリスト(Circular Linked List)が与えられ、そのリスト内に存在するノードの総数を求めるのが課題です。 循環リンクリストとは、連結リストの一種であり、最初の要素が最後の要素を指し、最後の要素が最初の要素を指すという特徴を持つデータ構造です。片方向リンクリスト(Singly Linked List)でも双方向リンクリスト(Doubly Linked List)でも、この循環リンクリストとして実装することが可能です。 以下のプログラムでは、片方向リンクリストを循環リンクリストとして実装し、その中に含まれるノード数をカウントする方法を紹介します。 具体