AngryLiverJavaScriptデータ構造-順序付きリンクリスト

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して14日目です。クリックしてイベントの詳細をご覧ください

みなさん、こんにちは。私の名前はヤン・チェンゴンです。

前回の記事では、循環リンクリストを紹介しました。これは、リンクリストの最後の記事であり、最後のタイプのリンクリストである順序付きリンクリストを紹介しています。

順序付きリンクリストとは、要素が並べ替え規則に従って順序付けられたリンクリスト構造を指します。ほとんどの並べ替えではアルゴリズムを使用して既存のデータを並べ替えますが、実際には、要素がリンクリストに挿入されるときに、挿入位置が並べ替えルールに準拠していることを確認することもできます。

それを行う方法を見てみましょう。

順序付きリンクリストを実装する

最初にSortedLinkedListクラスます:

class SortedLinkedList extends LinkedList {
  constructor(compareFn, equalFn) {
    let defFn = (a, b)=> a !== b ? a > b ? 1 : -1 : 0
    super(equalFn)
    this.compareFn = compareFn || defFn
  }
}
复制代码

LinkedListこのクラスは、リンクリストに関連するすべてのプロパティとメソッドを持つから継承します。違いは、このクラスは要素を比較して並べ替える必要があるため、比較用の関数も宣言する必要があることですcompareFn

もちろん、異なるデータ比較ルールが異なる可能性があるため、 compareFnをカスタマイズすることはできます。同時に、デフォルト関数として単純なタイプの比較を提供できます。カスタム関数が渡されない場合は、デフォルト関数が比較に使用されます。

デフォルトの比較ルールは次のとおりです。

  • a == b:0を返す
  • a > b:1を返す
  • a < b:-1を返す

基本クラスが実装されています。要素を挿入する方法を見てみましょう。

要素を順番に挿入する

リンクリストに要素を挿入するということは、固定インデックス位置に新しい要素を挿入することを意味します。ただし、順番に挿入するには、挿入された新しい要素が並べ替え規則を満たしている必要があります。

どうやってするの?つまり、新しい要素を取得した後、リンクリストをトラバースして各要素を新しい要素と比較し、比較結果に従って2つの要素の位置を交換する必要があるかどうかを判断する必要があります。最終的な位置が見つかるまで、このステップバイステップを続けます。

したがって、insertメソッドを作成する前に、照合を満たすために新しい要素が挿入される場所を照会するためのインデックスを取得する関数を作成してください。

getSortedItemIndex(item) {
  let current = this.head;
  let i;
  for(i = 0; i < this.size() && current; i++) {
    if(this.compareFn(item, current.value) < 0) {
      break;
    }
    current = current.next
  }
  return i
}
复制代码

この関数で設定されるルールはthis.compareFn(item, current.value) < 0です。つまり、新しい要素がリスト要素よりも小さい場合、ループは終了し、インデックスが返されます。

このインデックスに新しい要素が挿入された場合、新しい要素は常にリスト内の要素よりも小さくなります。それ以外の場合は、最後の要素になります。これにより、リンクリストは最終的に正の順序で配置されます。

それを試してみるか、リンクリストinsertメソッド:

insert(item) {
  if(this.isEmpty()) {
    return super.insert(item, 0)
  }
  let pos = this.getSortedItemIndex(item)
  return super.insert(item, pos)
}
复制代码

明らかに、順序付き挿入の挿入関数は、挿入位置が計算され、明示的に渡す必要がないため、2番目のindexパラメーターありません。

注文したインサートを使用する

上記のコードを試してください。

// 测试
var inst = new SortedLinkedList();
inst.insert(3);
inst.insert(8);
inst.insert(4);
inst.insert(6);
console.log(inst.toString());
复制代码

最終的な印刷結果は次3,4,6,8のとおりです。要件を満たす、最大から最小にソートされています。

次に、比較関数を定義します。たとえば、漢字の拼音の最初の文字の正の順序に従います。関数は次のとおりです。

const compareFn = (a, b)=> a.localeCompare(b)
复制代码

次に、この比較関数を使用してインスタンス化します。

var inst = new SortedLinkedList(compareFn);
inst.insert('上海');
inst.insert('南京');
inst.insert('北京');
inst.insert('广州');
console.log(inst.toString());
复制代码

印刷結果:北京,广州,南京,上海、要件を満たします!

要約する

この記事では、実際にソートされたリンクリストである順序付きリンクリストについて学習しました。順序付けられたリンクリストの主なロジックは追加することであり、追加された要素は自動的にソートされ、他のロジックはリンクリストの基本機能と一致しています。

リンクリストの紹介は終わりました。次の記事では、セットについて学びます。

この記事の出典は公式アカウントです:ProgrammerSuccessこれは、JavaScriptのデータ構造とアルゴリズムの学習に関する13番目の記事です。このシリーズは1か月間更新されます。公式アカウントをフォローし、[グループの追加]をクリックして学習チームに参加してください。

おすすめ

転載: juejin.im/post/7086858782172512287