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

推薦する

Centos8 で Apache httpd2.4.37 を使用して Web サーバーをインストールする詳細な手順

ステップ 1: yum install httpd -y #httpd サービスをインストールします...

Dreamweaver で Zen コーディングを使用する方法

前回の記事「Zen Coding: HTML/CSS コードを素早く記述する方法」を公開した後、一部...

MySQLデータベースを操作するためのコマンドラインツールmycliの簡単な紹介

GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...

explainコマンドがMySQLデータを変更する理由

クエリで EXPLAIN を実行するとデータベースが変更されるかどうかを尋ねられた場合、おそらく「い...

ファイル操作のためのLinuxシステムコール

目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...

Tkinterはjsキャンバスを使用してグラデーションカラーを実現します

目次1. RGBを使用して色を表す2. Tkinter キャンバスコンポーネント3. グラデーション...

Alibaba Cloud Server で MySQL デュアルマシン ホットスタンバイを手動で実装する 2 つの方法

1. コンセプト1. ホットバックアップとバックアップの違いホット バックアップは高可用性 (HA)...

elasticsearchを使用してインデックスデータを定期的に削除する

1. ESを使うこともあるリソースが限られている、またはビジネス上のニーズにより、最新の期間のデータ...

文字列から指定された文字を削除または抽出する JavaScript メソッド (非常によく使用されます)

目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...

MySQLデータベースを誤って削除した後にデータを回復するための手順

日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...

ツリー チャートの実装方法に関する Echarts チュートリアル

ツリーマップは主にツリーのようなデータ構造を視覚化するために使用され、特殊なタイプの階層です。これを...

SQL 実践演習: オンライン モール データベースの製品カテゴリ データ操作

オンラインショッピングモールデータベース - 商品カテゴリデータ操作(I)プロジェクトの説明電子商取...

Vue3 コンパイルプロセス - ソースコード分析

序文: Vue3 がリリースされてからかなり経ちますが、最近、会社のプロジェクトでVue3 + Ty...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...

HTMLセマンティクスと関連するフロントエンドフレームワークの詳細な分析

セマンティクスについて意味論は、記号やシンボルとそれらが表す意味との関係を研究する学問です。言語学で...