JavaScript データ構造 双方向リンクリスト

JavaScript データ構造 双方向リンクリスト

単方向リンク リストは、先頭から末尾、または末尾から先頭への方向のみを走査できます。そのため、単方向リンク リストは次のノードに簡単に到達できますが、前のノードに戻ることは困難です。

双方向リンク リストは、先頭から末尾へ、また末尾から先頭へ移動できます。リンク リストの接続は双方向です。ノードには、前方接続参照と後方接続参照の両方があります。

しかし、このため、ノードを挿入または削除するときに、二重リンクリストは 4 つのノードの参照を処理する必要があり、占有されるメモリ領域も大きくなります。

二重リンクリストの実装

二重リンクリストを実装する JavaScript コード

// 二重リンクリストコンストラクタ関数を作成する DoublyLinkedList() {
 // ノードコンストラクタ関数を作成する Node(element) {
  this.element = 要素
  this.next = null
  this.prev = null // 新しく追加されました}

 // プロパティを定義します this.length = 0
 this.head = null
 this.tail = null // 新しく追加 // 関連する操作メソッドを定義 // 末尾にデータを追加 DoublyLinkedList.prototype.append = function (element) {
  // 1. 要素に基づいてノードを作成する var newNode = new Node(element)

  // 2. リストが空のリストかどうかを判定する if (this.head == null) {
   this.head = 新しいノード
   this.tail = 新しいノード
  } それ以外 {
   this.tail.next = 新しいノード
   newNode.prev = this.tail
   this.tail = 新しいノード
  }

  // 3.長さ+1
  this.length++
 }

 //任意の位置にデータを挿入する DoublyLinkedList.prototype.insert = function (position, element) {
  // 1. 範囲外の問題を特定する if (position < 0 || position > this.length) return false

  // 2. 新しいノードを作成する var newNode = new Node(element)

  // 3. 挿入位置を決定する if (position === 0) { // 最初の位置にデータを挿入する // リンクリストが空かどうかを判定する if (this.head == null) {
    this.head = 新しいノード
    this.tail = 新しいノード
   } それ以外 {
    this.head.prev = 新しいノード
    newNode.next = this.head
    this.head = 新しいノード
   }
  } else if (position === this.length) { // 末尾に挿入 // 考えてみましょう: この場合、リンク リストが空かどうかを確認する必要がありますか? 答えは「いいえ」です。なぜでしょうか?
   this.tail.next = 新しいノード
   newNode.prev = this.tail
   this.tail = 新しいノード
  } else { // 中央にデータを挿入 // 属性を定義する var index = 0
   var 現在の = this.head
   var 前 = null

   // 正しい位置を見つける while (index++ < position) {
    前 = 現在
    現在の = 現在の.次の
   }

   //ノードの指示順序を交換する newNode.next = current
   newNode.prev = 前
   current.prev = 新しいノード
   previous.next = 新しいノード
  }

  // 4.長さ+1
  this.length++

  真を返す
 }

 // 位置に応じて対応する要素を削除します。DoublyLinkedList.prototype.removeAt = function (position) {
  // 1. 範囲外の問題を解決する if (position < 0 || position >= this.length) return null

  // 2. 削除する場所を決定する var current = this.head
  if (位置 === 0) {
   (この長さが1の場合){
    this.head = null
    this.tail = null
   } それ以外 {
    this.head = this.head.next
    this.head.prev = null
   }
  } そうでない場合 (位置 === this.length -1) {
   現在の = this.tail
   this.tail = this.tail.prev
   this.tail.next = null
  } それ以外 {
   変数インデックス = 0
   var 前 = null

   while (インデックス++ < 位置) {
    前 = 現在
    現在の = 現在の.次の
   }

   前へ.次へ = 次へ
   current.next.prev = 前
  }

  // 3.長さ-1
  this.length--

  現在の要素を返す
 }

 // リンクリスト内の要素の位置を取得する DoublyLinkedList.prototype.indexOf = function (element) {
  // 1. 情報を保存する変数を定義する var current = this.head
  変数インデックス = 0

  // 2. 正しい情報を探す while (current) {
   if (current.element === element) {
    インデックスを返す
   }
   インデックス++
   現在の = 現在の.次の
  }

  // 3. この位置に見つからない場合は -1 を返す
  -1を返す
 }

 // 要素に応じて削除する DoublyLinkedList.prototype.remove = function (element) {
  var インデックス = this.indexOf(要素)
  this.removeAt(index) を返します
 }

 // 空かどうか確認する DoublyLinkedList.prototype.isEmpty = function () {
  this.length === 0 を返す
 }

 // リンクリストの長さを取得する DoublyLinkedList.prototype.size = function () {
  this.lengthを返す
 }

 // 最初の要素を取得する DoublyLinkedList.prototype.getHead = function () {
  this.head.elementを返す
 }

 // 最後の要素を取得する DoublyLinkedList.prototype.getTail = function () {
  this.tail.elementを返す
 }

 // トラバーサルメソッドの実装 // フォワードトラバーサルメソッド DoublyLinkedList.prototype.forwardString = function () {
  var 現在の = this.head
  var forwardStr = ""

  while (現在) {
   forwardStr += "," + 現在の要素
   現在の = 現在の.次の
  }

  forwardStr.slice(1) を返す
 }

 // 逆トラバーサルメソッド DoublyLinkedList.prototype.reverseString = function () {
  var 現在の値 = this.tail
  var 逆Str = ""

  while (現在) {
   逆Str += "," + 現在の要素
   現在 = 現在.前
  }

  逆Str.slice(1)を返す
 }

 // toStringメソッドを実装する DoublyLinkedList.prototype.toString = function () {
  this.forwardString() を返す
 }
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JS を使用してデータ型を決定する 4 つの方法
  • JSにおけるデータ型の正しい判定方法の例
  • JavaScript プリミティブデータ型シンボルの詳細な説明
  • JavaScript データ型の詳細な説明
  • この記事では、jsのデータ型とデータ構造の世界を紹介します。

<<:  CentOs システムで Python と yum をアンインストールするソリューション

>>:  MySQL ページング分析の原理と効率改善

推薦する

Docker イメージ管理の一般的な操作コード例

ミラーリングも Docker のコアコンポーネントの 1 つです。ミラーリングはコンテナ操作の基盤で...

CentOS7 64ビットインストールmysqlグラフィックチュートリアル

MySQL をインストールするための前提条件: CentOS 7 64 ビットをインストールし、Ce...

MySql ストアド プロシージャ パラメータの初歩的な使用法の詳細な説明

パラメータでのストアドプロシージャの使用IN パラメータは、プロシージャに情報を渡すためにのみ使用さ...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

CSS3 で半透明の背景画像と不透明なコンテンツを実現する方法の例

以前のブログのログインページを作成していたときに、この問題に遭遇しました。突然、透明な背景画像と不透...

WindowsシステムでMySQLデータベースを完全にアンインストールして、MySQLを再インストールします

1. コントロールパネルで、MySQLのすべてのコンポーネントをアンインストールします。コントロール...

InnoDB のアーキテクチャと機能の詳細な説明 (InnoDB ストレージ エンジンの読書メモの要約)

背景スレッド•マスタースレッドコア バックグラウンド スレッドは主に、バッファー プール データをデ...

Vue3 (III) ウェブサイトホームページレイアウト開発

目次1. はじめに2. 実際の事例1. App.vueを変更する2. レイアウトを調整する3. ジャ...

Viteの新しい体験の詳細な説明

Vite とは何ですか? (フロントエンドの新しいおもちゃです) Vite は、ネイティブ ES モ...

MySQL シャーディング入門ガイド

序文リレーショナル データベースは、システムのボトルネックになる可能性が高くなります。単一のマシンの...

MySQL トリガーの基本的な使い方(作成、表示、削除など)の詳細な説明

目次1. MySQLトリガーの作成: 1. MySQLトリガー作成構文: 2. MySQL作成構文の...

CSS3はブラウザのスクロールバーのスタイルを変更します

注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...

HTML/CSSにおける記号論の詳細な説明

この記事では、ソシュールの言語哲学などの理論に基づいて、CSS の class 属性は不要であると主...

Ubuntu 20.04 ベスト設定ガイド (初心者向け)

1. システム構成1. sudoパスワードをオフにするsudo コマンドを使用するたびにパスワード...

Nginx/Httpd リバース プロキシ Tomcat 設定チュートリアル

以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...