序文: 複数の要素を格納するために、配列は最も一般的に使用されるデータ構造ですが、配列には多くの欠点もあります。
したがって、複数の要素を格納するための別のオプションは、リンク リストです。配列とは異なり、リンク リスト内の要素はメモリ内で連続したスペースである必要はありません。リンク リストの各要素には、要素自体と次の要素への参照を格納するノードがあります。
リンク リストには、配列に比べていくつかの欠点があります。
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時計を作成します。
この記事では、js+canvasコードの雨効果の具体的なコードを参考までに共有します。具体的な内...
結果:実装コード: <!DOCTYPE html><html class=&quo...
序文多くのサイトが、ポイントやゴールドコインなど、情報のダウンロードに料金を請求していることは誰もが...
IEでのRGBAとフィルター値の変換RGBA 透明度値IE フィルター値0.1 19 0.2 33 ...
1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...
1. 背景多くのブログや記事を読みましたが、JVM のメモリ割り当て方法に関する包括的な記事は見つか...
コードをコピーコードは次のとおりです。 <html> <!--混合フレームレイアウ...
よく聞かれる答えは、列に NULL 値を使用するとインデックスが無効になるというものですが、実際にテ...
目次総合的な比較アクティブの観点から機能的な観点から詳細な比較1. エース2. コードミラー3. モ...
次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...
目次NULLとは何か2種類のNULLなぜ「= NULL」ではなく「IS NULL」と書く必要があるの...
MySQLをダウンロード5.1.1.1 より前のバージョン私のコンピュータは64ビットなので、Win...
<br />この記事は主に、初心者にXHTMLの基本知識と、XHTMLとHTMLの違いを...
1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...
1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...