リスト!データ構造の削除の操作のアレイよりも適し

リストとは何ですか?

  • リストと配列を比較しますので、要素を移動する必要性が非常に高いコストをほとんどの言語では、配列のサイズは、固定されている配列の先頭や途中から追加または要素を削除します。
  • メモリ内のリンクされたリストの各要素は、連続して配置されていない、と要素のその左右両側には関係ありません。
  • 各要素は、基準点における自ノードと記憶素子の組成を有しています。
  • 配列に関しては、他の要素を移動することなく、時間の要素を追加または削除利点のリスト。
  • アレイでは、我々は、直接任意の位置に任意の要素にアクセスすることができますが、一つの要素のリストにアクセスするためには、あなたが見つけるまで開始(リストの先頭)から必要な要素は、リストを反復処理する必要があります。

栗の場合:列がコンパートメントのシリーズで構成されています。各車やワゴンが相互に接続されている、あなたは簡単に、その位置を変更するには、それを追加または削除するには、トランクを分離することができます。ドッキング区画バックルが基準要素である間に各車は、リストの要素に相当します。

クラスリストを作成します

const defaultCompare = function (a, b) { // 一个比较函数 if (a === b) return 0; return a < b ? -1 : 1; } class Node { // 一个助手类,用来表示我们想要添加到链表中的元素 constructor(element, next) { this.element = element; // 元素的值 this.next = next; // 指向链表中下一个元素的指针 } } class LinkedList { // 链表类 constructor(equalsFn = defaultEquals) { this.equalsFn = equalsFn; // 比较链表中的元素是否相等,默认a===b this.count = 0; // 链表中的元素数量 this.head = undefined; // 表头 } } 

いくつかの方法のリストを作成します。

  1. リストの最後に要素を追加します。
push(element) {
    const node = new Node(element); // 创建node项
    let current; // 声明一个指向链表中的临时项 if (this.head == undefined) { // 如果链表头为空,即链表为空 this.head = node; // 直接让表头等于当前元素就好了,下一项(next)未传,因此为undefined } else { current = this.head; // 先让current等于第一个元素 while (current.next != null) { // 只要当前元素的下一项元素不是假的,便继续循环 current = current.next; } current.next = node; // 找到最后一个元素后,让它的下一个元素等于传进来的元素 } this.count++;// 最后把总长度自增就好了 } 
  • ファーストクラスの初期化ノード、渡された値として要素。
  • 、あなたはリストの末尾に要素を追加するときに、我々は、円形のリストを必要とする、リストの頭部のみ参照リストので、後者は1がバリューチェーンが、そこにある、1はリストが空である、尾の要素が2例に分けている追加あなたは私たちがリンクリストの変数現在のエントリ・ポイントを必要とする対象の最後の要素を、見つけるまで。
  • リストの先頭は、最初の要素の値がリストに追加さを示していない場合は、直接ヘッダに現在の要素に等しくなるような場合、参照(次)の次の項目は、未定義のため、通過しません
  • そして、後者の場合で、リストの先頭に等しい電流せ、その後、あなたは最後の要素を見つけるまでリストを反復、それはあなたがリストにノードを追加する次の項目を指して最後の要素への参照を作ることです。
  • 最後に、増分の合計の長さだけで罰金
  1. 特定の位置から要素を除去すること
removeAt(index) {
    if (index >= 0 && index < this.count) { // 检查越界值
      let current = this.head; if (index === 0) { // 如果是表头 this.head = current.next; // 就让表头等于下一个引用 } else { let previous; for (let i = 0; i < index; i++) { // 嗯,开始迭代把~~~ previous = current; current = current.next; } previous.next = current.next; // 上一个的下一个等于现在的下一个,,,(现在内心os:我是谁,我在哪???)当前节点就会被丢弃在计算机内存中,等着被垃圾回收器移除 } this.count--;// 长度自减 return current.element; // 返回移除的元素 } return undefined; } 
  • この方法は、要素のインデックス(位置)を除去する必要があるため、我々は、インデックスが0からリンクされたリストとの間の長さであることを確認する必要があります。ない場合は、undefinedを返します。
  • あなたは、リストの最初の要素を削除した場合、我々は頭がリストの2番目の要素を指すようにする必要があります。私たちは、リストの現在の変数最初の要素への参照を作成します。そのような現在の変数は、リストの最初の要素への参照です。この時間は、ヘッドcurrent.next場合は割り当てられている場合は、最初の要素は削除されます。我々はまた、直接電流を使用していない、head.nextに頭を割り当てることができます。
  • 我々は削除する場合は、リストの要素または途中で最後の要素です。私たちは、あなたが目標位置に到達するまで、リストを反復処理する必要があります。
  • 目標位置に到達した後、現在は、私たちは、リストから削除する変数ノードになります。そのため、現在の要素を行うには、リストから削除されprevious.nextとリンクcurrent.nextすることです。したがって、現在のノードは、ガベージコレクタであることが待っている、コンピュータメモリに廃棄されます。
  1. ターゲット・ロケーション・リストまでループが繰り返さ
getElementAt(index) {
    if (index >= 0 && index <= this.count) return undefined; // 检查越界值 let node = this.head; // 默认等于表头 for (let i = 0; i < index && node != null; i++) { // 嗯,开始迭代把~~~ node = node.next; } return node; } 
  • removeメソッドでは、我々はあなたが私たちの宛先インデックスインデックス(位置)に達するまで、リストを反復処理する必要があります。リスト内のターゲットインデックスにリサイクルフラグメントは、頻繁にプロセスで使用されます。あなたが別の場所で再利用できるように、したがって、我々は、この部分に論理的に依存しない方法を分離することができます。
  • そして、私たちはremoveメソッドを再構築するために作成したgetElementAtメソッドを使用することができます
if(index===0){
    // 第一个位置的逻辑
} else {
    const previous = this.getElementAt(index - 1); current = previous.next; previous.next = current.next; } this.count--; 
  1. 任意の位置に要素を挿入します
insert(element, index) {
    if (index >= 0 && index <= this.count) { // 边界处理
      const node = new Node(element); // 实例化当前元素 if (index === 0) { // 如果插在表头 const current = this.head;// 声明一个变量,等于原来的表头 node.next = current;// 传入元素的下一个引用等于current this.head = node; // 当前表头等于传入的元素 } else { const previous = this.getElementAt(index - 1);// 找到传入索引的上一个值 previous.next = node;// 上一个的引用等于传入的值 node.next = previous.next;// 传入值的下一个引用等于上一个的下一个引用 } this.count++;// 总长度自增 return true; // 最后返回true } return false; // 如果位置未找到返回false } 
  • 第1の境界処理をどうするかを練習。
  • それは、リストの先頭に挿入されている場合、最初のは、元のリストの先頭に等しい変数を宣言する基準電流にインサート要素は、元の変数に等しくさせ、そしてメーターが渡された現在の要素に等しいせてみましょう。
  • それはエンドであるか、我々は、リストの中央にgetElementAtでターゲット要素法の場所を見つけ、その後、基準値への着信等しいようにする必要がある場合。その後、次の基準に等しい基準値の下を通過。最後に、我々は全体の長さを追加するために覚えておく必要があり、trueを返します
  1. 要素の位置を返します。
indexOf(element) {
    let current = this.head; // 等于表头
    for (let i = 0; i < this.size() && current != null; i++) { // 循环迭代所有元素 if (this.equalsFn(element, current.element)) { // 找到和当前元素相等的第一个元素 return i;// 返回索引 } current = current.next;// 如果不相等,就继续迭代下一个 } return -1; // 如果都没找到,就返回-1 } 
  • それはリストに見つかった場合に要素の値を受信するindexOfメソッドは、それがそうでなければ、要素の位置を返す-1。
  • いつものように、あなたは、私たちは、リストを反復処理を支援するための変数を必要としています。この変数は、その初期値はヘッド現在です
  • その後繰り返し要素、リストの長さまで、リストの先頭から始まります。あなたがエラーを実行したときにそれが起こらないことを確認するために、我々は、現在の変数がnullまたは未定義であることを確認することができます。
  • ループの反復処理は、現在の要素に等しいすべての要素と最初の要素を検索し、その位置を返すまで
  • 見つからない場合は、-1を返します
  1. 渡された要素を削除します
remove(element) { 
    const index = this.indexOf(element); // 先找到这个元素的第一个索引
    return this.removeAt(index); // 利用删除指定位置元素的方法,搞掉它 } 
  • 私たちは、与えられた要素の位置を削除するために使用する方法を持って、またのindexOfメソッドとなっています。その位置を見つけるために、indexOfメソッドを使用して、要素の位置は、それを取り除く、指定されたメソッドを削除します。
  1. 空の場合は、リストの先頭を取得し、長さをチェックしてください
isEmpty() {
    return this.size() === 0;
  }
  size() {
    return this.count; } getHead() { return this.head; } 
  • それは非常に簡単です。
  1. すべての要素が文字列に変換します
toString() {
    if (this.head == null) { // 如果列表为空,就返回空字符串
      return ''; } let objString = `${this.head.element}`; // 创建一个变量,先让他等于表头的元素 let current = this.head.next; // 等于表头的下一个引用 for (let i = 1; i < this.size() && current != null; i++) { // 循环迭代所有元素 objString = `${objString},${current.element}`; // 让这个字符串等于原来的字符串加上当前元素 current = current.next; // 当前元素等于当前的下一个引用 } return objString; // 最后把这个字符串返回 } 
  • リストが空の場合はまず、我々は空の文字列を返します。
  • 我々は、初期化するための最後のメソッドで返されたリストの最初の要素の値を持つ文字列値を持っている場合。
  • その後、我々はリストの他のすべての要素を反復処理、文字列に要素の値を追加します。
  • 最後に、返される文字列。

遂に

  • ここでは、レコードの今日の手のノート、と私は、リストの様々な強化されたバージョンについての記事を書くための時間を持つことになります。要するに、私は、配列が比較的一定の順序集合の一部を格納するための、より適している、追加および削除操作のためのより適切なリンクリストの配列に比べて、この章を読み終えた後。

おすすめ

転載: www.cnblogs.com/xingyongwang/p/11125934.html