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 ページング分析の原理と効率改善

推薦する

Nginx 構成 SSL および WSS 手順の紹介

目次序文1. Nginxのインストール1. Nginxをダウンロードする2. 依存関係をインストール...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

Nodejs モジュール システムのソースコード分析

目次概要CommonJS 仕様Node の CommonJS 仕様の実装モジュールのエクスポートとイ...

vsFTP 3.0.3 のコンパイルとインストールの詳細な分析

脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

MySQL フルテキスト検索の中国語ソリューションとサンプルコード

MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...

XHTML の IE 条件付きコメント

<br />条件付きコメントはIEシリーズ製品上でXHTMLコード処理を分離して行うこと...

XHTMLコードの一般的なアプリケーション問題をまとめる

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...

ウェブページ作成のテスト問題を全て解けますか?

Web ページのデザインに関する質問です。すべてに答えられるでしょうか? 1. 単一選択の質問 (...

Windows での Nginx のインストールと環境設定 (nginx をサービスとして実行)

最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...

変数が空かどうかを判定するシェルの方法の概要

シェルで変数が空かどうかを判断する方法シェルプログラミングでは、パラメータのエラーチェック項目に、変...

オブジェクト指向の観点から Vue コンポーネントを理解するための簡単な分析

同じ関数や HTML コードが複数回使用される場合は、それらをコンポーネントに抽出することを検討でき...

Linux カーネルの copy_{to, from}_user() に関する考察

目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...

Vue のデータ応答性に関する詳細な理解

目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...

Vueカスタム命令とその使用方法の詳細な説明

目次1. 指令とは何ですか? Vue でよく使われる組み込みの v ディレクティブv-if と v-...