単方向リンク リストは、先頭から末尾、または末尾から先頭への方向のみを走査できます。そのため、単方向リンク リストは次のノードに簡単に到達できますが、前のノードに戻ることは困難です。 双方向リンク リストは、先頭から末尾へ、また末尾から先頭へ移動できます。リンク リストの接続は双方向です。ノードには、前方接続参照と後方接続参照の両方があります。 しかし、このため、ノードを挿入または削除するときに、二重リンクリストは 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: CentOs システムで Python と yum をアンインストールするソリューション
ステップ 1: yum install httpd -y #httpd サービスをインストールします...
前回の記事「Zen Coding: HTML/CSS コードを素早く記述する方法」を公開した後、一部...
GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...
クエリで EXPLAIN を実行するとデータベースが変更されるかどうかを尋ねられた場合、おそらく「い...
目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...
目次1. RGBを使用して色を表す2. Tkinter キャンバスコンポーネント3. グラデーション...
1. コンセプト1. ホットバックアップとバックアップの違いホット バックアップは高可用性 (HA)...
1. ESを使うこともあるリソースが限られている、またはビジネス上のニーズにより、最新の期間のデータ...
目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...
日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...
ツリーマップは主にツリーのようなデータ構造を視覚化するために使用され、特殊なタイプの階層です。これを...
オンラインショッピングモールデータベース - 商品カテゴリデータ操作(I)プロジェクトの説明電子商取...
序文: Vue3 がリリースされてからかなり経ちますが、最近、会社のプロジェクトでVue3 + Ty...
誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...
セマンティクスについて意味論は、記号やシンボルとそれらが表す意味との関係を研究する学問です。言語学で...