単方向リンク リストは、先頭から末尾、または末尾から先頭への方向のみを走査できます。そのため、単方向リンク リストは次のノードに簡単に到達できますが、前のノードに戻ることは困難です。 双方向リンク リストは、先頭から末尾へ、また末尾から先頭へ移動できます。リンク リストの接続は双方向です。ノードには、前方接続参照と後方接続参照の両方があります。 しかし、このため、ノードを挿入または削除するときに、二重リンクリストは 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. Nginxのインストール1. Nginxをダウンロードする2. 依存関係をインストール...
序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...
目次概要CommonJS 仕様Node の CommonJS 仕様の実装モジュールのエクスポートとイ...
脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...
新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...
MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...
<br />条件付きコメントはIEシリーズ製品上でXHTMLコード処理を分離して行うこと...
<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...
Web ページのデザインに関する質問です。すべてに答えられるでしょうか? 1. 単一選択の質問 (...
最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...
シェルで変数が空かどうかを判断する方法シェルプログラミングでは、パラメータのエラーチェック項目に、変...
同じ関数や HTML コードが複数回使用される場合は、それらをコンポーネントに抽出することを検討でき...
目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...
目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...
目次1. 指令とは何ですか? Vue でよく使われる組み込みの v ディレクティブv-if と v-...