単方向リンク リストは、先頭から末尾、または末尾から先頭への方向のみを走査できます。そのため、単方向リンク リストは次のノードに簡単に到達できますが、前のノードに戻ることは困難です。 双方向リンク リストは、先頭から末尾へ、また末尾から先頭へ移動できます。リンク リストの接続は双方向です。ノードには、前方接続参照と後方接続参照の両方があります。 しかし、このため、ノードを挿入または削除するときに、二重リンクリストは 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 をアンインストールするソリューション
ミラーリングも Docker のコアコンポーネントの 1 つです。ミラーリングはコンテナ操作の基盤で...
MySQL をインストールするための前提条件: CentOS 7 64 ビットをインストールし、Ce...
パラメータでのストアドプロシージャの使用IN パラメータは、プロシージャに情報を渡すためにのみ使用さ...
ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...
以前のブログのログインページを作成していたときに、この問題に遭遇しました。突然、透明な背景画像と不透...
1. コントロールパネルで、MySQLのすべてのコンポーネントをアンインストールします。コントロール...
背景スレッド•マスタースレッドコア バックグラウンド スレッドは主に、バッファー プール データをデ...
目次1. はじめに2. 実際の事例1. App.vueを変更する2. レイアウトを調整する3. ジャ...
Vite とは何ですか? (フロントエンドの新しいおもちゃです) Vite は、ネイティブ ES モ...
序文リレーショナル データベースは、システムのボトルネックになる可能性が高くなります。単一のマシンの...
目次1. MySQLトリガーの作成: 1. MySQLトリガー作成構文: 2. MySQL作成構文の...
注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...
この記事では、ソシュールの言語哲学などの理論に基づいて、CSS の class 属性は不要であると主...
1. システム構成1. sudoパスワードをオフにするsudo コマンドを使用するたびにパスワード...
以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...