序文: 複数の要素を格納するために、配列は最も一般的に使用されるデータ構造ですが、配列には多くの欠点もあります。
したがって、複数の要素を格納するための別のオプションは、リンク リストです。配列とは異なり、リンク リスト内の要素はメモリ内で連続したスペースである必要はありません。リンク リストの各要素には、要素自体と次の要素への参照を格納するノードがあります。
リンク リストには、配列に比べていくつかの欠点があります。
1. 単方向リンクリストとは何かでは、単方向リンクリストとは一体何でしょうか? これは電車のようなもので、機関車はノードに接続され、ノードには乗客がいて、このノードは次のノードに接続され、以下に示すように続きます。 リンクリストの構造は次のとおりです。 直感的なリンク リストを理解したので、単一リンク リストのコードをカプセル化してみましょう。 2. 単方向リンクリストのカプセル化まず、リンク リスト構造を表す 以下のように表示されます。 関数LinkedList(){ this.length = 0; this.head = null; //内部クラス関数 Node(data){ this.data = データ; this.next = null; } } 3. 単連結リストの一般的な操作次に、単一リンクリストのよく使用される操作を追加します。主なものは次のとおりです。
次に、それらを1つずつ実装します。 1. append(element) メソッド-----リストの末尾に項目を追加するリンク リストの末尾にデータを追加する場合、次の 2 つの状況が考えられます。
したがって、判断する必要があります。リンク リストが空の場合は、ヘッド ノードのポインタを新しいノードに直接ポイントします。 LinkedList.prototype.append = function(data){ var newNode = 新しいノード(データ); // リンクリストが空かどうかを判定します // 1. 空の場合 if (this.length === 0) { ノードを新規作成します。 }それ以外{ //空ではありません var current = this.head; if(現在.次){ 現在の = 現在の.次; } 現在のノードの次。 } this.length += 1; } 2. toStringメソッド ----- 要素の値を出力するこれは比較的簡単です。主なことは、各要素を取得することです。リンク リストの要素を取得するには、最初のノードから開始する必要があるため、先頭ノードから開始し、各ノードをループして、その中の LinkedList.prototype.toString = 関数(){ var 現在の = this.head; var ListStr = ''; while(現在){ ListStr += 現在のデータ + ' '; 現在の = 現在の.次; } ListStr を返します。 } 検証: いくつかの新しいノードを作成し、印刷します var list = 新しい LinkedList(); リストに追加します('a'); リストに追加します('b'); リストに追加します('c'); リストに追加します('d'); リストに追加します('e'); アラート(リスト); 印刷結果は次のとおりです。 3. 挿入メソッド ----- リスト内の特定の位置に項目を挿入する任意の位置にデータを挿入する方法を実装するには、まず挿入位置が範囲外かどうかを判断し、範囲外ではない場合を 2 つのケースに分けます。最初の位置に挿入された場合は、新しく追加されたノードがヘッドであることを意味します。その後、元のヘッド ノードを新しいノードの次のノードとして使用し、ヘッドが新しいノードを指すようにします。他の位置に挿入する場合は、まずループを介してノードの位置を見つけ、ループ中に前のノードと次のノードを保存する必要があります。正しい位置を見つけた後、新しいノードの コードは次のとおりです。 LinkedList.prototype.insert = function(位置,データ){ if(位置<0 || 位置 >this.length){ false を返します。 } var newNode = 新しいノード(データ); var インデックス = 0; if(位置 == 0){ Node.next = this.head; ノードを新規作成します。 }それ以外{ while(インデックス++ < 位置){ var 現在の = this.head; var 前 = null; 前 = 現在; 現在の = 現在の.次; } 現在のノードを次に示します。 previous.next = 新しいノード; } this.length += 1; true を返します。 } 検証: 最初の位置に xl を挿入し、2 番目の位置に wh を挿入します。 リストを挿入(1,'xl') リストを挿入(2,'wh') アラート(リスト) 4. 取得メソッド-----対応する位置の要素を取得するこの方法は比較的単純です。まず、 LinkedList.prototype.get = function(位置,データ){ var 現在の = this.head; var インデックス = 0; if(位置 < 0 || 位置 >= this.length){ null を返します。 }それ以外{ while(インデックス<位置){ 現在の = 現在の.次; インデックス++; } 現在のデータを返します。 } } 検証: 3 番目の位置にある要素を取得します。 アラート(リスト.get(3)); 5. indexOf() メソッド ----- リスト内の要素のインデックスを返しますまず、検索対象の要素の位置が存在するかどうかを判断します。存在しない場合は -1 を返します。存在する場合、2 つのケースがあります。返された要素が最初の位置にある場合、最初の位置のインデックスが直接返されます。返された要素が別の位置にある場合は、最初にループを介してノードの位置を見つける必要があります。このプロセス中、インデックスはトラバーサルの数だけ増加する必要があります。正しい要素の位置を見つけた後、印刷されたインデックスがターゲットの位置になります。 LinkedList.prototype.indexOf = function(data){ var インデックス = 0; var 現在の = this.head; while(現在){ 現在のデータ == データの場合 インデックスを返します。 } それ以外{ 現在の = 現在の.次; インデックス++; } } -1 を返します。 } } 検証: c のインデックスを取得します。 アラート(リストのインデックス('c')); 6. 更新方法-----特定の位置にある要素を変更するこのメソッドは get メソッドと非常によく似ています。後方にトラバースします。index LinkedList.prototype.update = function(position,ele){ if(位置<0 || 位置>=this.length){ false を返します。 }それ以外{ var インデックス = 0; var 現在の = this.head; while(インデックス++ <位置){ 現在の = 現在の.次; } 現在のデータ = ele; true を返します。 } } 検証: 位置0の要素をbearに変更します リストを更新(0,'クマ') アラート(リスト) 7. removeAt メソッド-----リストの指定された位置から項目を削除しますまず、削除された項目の位置が範囲外かどうかを判断します。範囲外ではない場合は、 LinkedList.prototype.removeAt = function(位置,データ){ var 現在の = this.head; var 前 = null; var インデックス = 0; if(位置<0 || 位置>=this.length){ false を返します。 }それ以外{ while(インデックス++ <位置){ 前 = 現在; 現在の = 現在の.次; } 前の.次の = 現在の.次の; this.length -= 1; true を返します。 } } } 検証: 3 番目の位置にある要素を削除します。 リスト.削除(3) アラート(リスト) 8. Removeメソッド - リストから項目を削除するまず、削除する要素がリンク リスト内にあるかどうかを判断します。ない場合は、 LinkedList.prototype.remove = function(ele){ var 現在の = this.head; var 前 = null; var インデックス = 0; while(current.data !== ele){ 前 = 現在; 現在の = 現在の.次; インデックス++; } 前の.次の = 現在の.次の; } 検証: 値が xl の要素を削除します。 リストを削除します('xl') アラート(リスト) 9. isEmpty メソッド-----リンクリストが空かどうかを判定する
LinkedList.prototype.isEmpty = 関数(){ this.length == 0 を返します。 } 確認する: アラート(リストが空です()) 9. Sizeメソッド ----- リンクリストに含まれる要素の数を返します直接返される要素の LinkedList.prototype.size = 関数(){ this.length を返します。 } 確認する: アラート(リスト.サイズ()) これで、JavaScript による単一リンクリスト プロセス解析の実装に関するこの記事は終了です。JavaScript による単一リンクリスト コンテンツの実装に関する関連情報については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: CSS3は、Transformを使用して動く2D時計を作成します。
Windowsユーザー向けDocker で openGauss を使用するopenGaussイメージ...
MySQL 外部キー制約の無効化と有効化: MySQL 外部キー制約が有効になっているかどうかは、グ...
MySQL を使用して中国語の文字を挿入すると、多くの友人から次のエラーが報告されます。 これは、文...
序文: vue3.0の要素フレームワークを使用します。要素はvue2.0をサポートしており、vue3...
SQL では、GROUP BY は SELECT の結果のデータをグループ化するために使用されます。...
仮想マシンの IP アドレスを変更します。 次のインターフェイスに入り、サブネット IP を直接変更...
目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...
この記事では、ブルーグリーン デプロイメントと、nginx を使用してブルーグリーン デプロイメント...
クエリキャッシュ1. クエリキャッシュの動作原理クエリ ステートメントを実行する前に、MySQL は...
目次序文1. サービスプログラムをインストールする2. メイン設定ファイルを書く3. サブ構成ファイ...
1. Vueルーティングの権限制御には一般的に2つの方法がありますa. ルーティングメタ情報(メタ)...
この記事の例では、両端キューを実装するためのJavaScriptの具体的なコードを参考までに共有して...
文法 背景: linear-gradient(direction,color-stop1,color...
目次1. ロックとラッチ2. 繰り返し読み取り3. インサートロックプロセス3.1 ロックモード3....
MySQL 内部には至るところにキャッシュがあります。MySQL のソースコードを読むと、キャッシ...