循環リンクリスト
単一リンクリスト内のターミナルノードのポインタ端をnullポインタからヘッドノードに変更すると、単一リンクリスト全体がリングを形成します。この単一リンクリストは、単一リンクリストまたは循環リンクリストと呼ばれます。略して。)。単一リンクリストのように、循環リンクリストは必ずしもヘッドノードを持っている必要はありませんが、ヘッドノードを備えた循環リンクリストは空のリンクリストと空でないリンクリストの処理を一貫させます。
この場合、最初の要素へのアクセスにはO(1)O(1)が必要です。O (1 )時間ですが、最後の要素にアクセスするにはO(n)O(n)が必要ですO (n )。ヘッドノードを持つ循環リンクリストの後続ポインタは、ヘッドノードを指します。
二重リンクリスト
単一リンクリストと循環リンクリストには問題があります。要素にアクセスすると、時間計算量はO(1)O(1)です。O (1 )、次回また訪れる時間はO(n)O(n)O (n )この問題を解決するために、二重リンクリストが発明されました。
空の二重リンクリストの場合、ヘッドノードのフロントポインタとバックポインタは同じヘッドノードを指します。
二重リンクリストは、単一リンクリストの各ノードの先行ノードへのポインタフィールドを設定することです。二重リンクリストには、2つのポインタフィールドがあります。1つは先行フィールドへ、もう1つは後続フィールドへのポインタです。その構造は次のように設計できます。
typedef struct DulNode
{
int data;
struct DulNode * prev;
struct DulNode * next;
}DulNode,
typedef DulNode * pDuLinkList;
二重リンクリストには、次の式があります。
p->next->prev=p=p->prior->next;
二重にリンクされたリストは逆トラバーサルを容易にしますが、ストレージスペースと操作の複雑さももたらします。たとえば、挿入操作:
pがノードN2を指し、p-> nextがN3を指し、sがNが挿入されるノードを指すと仮定します。
s->next=p->next;
s->prev=p->next->prev;
p->next=s;
p->next->prev=s;
元のノードの情報は、最初に処理のために新しいノードに送信されることに注意してください。
pが削除されるノードBを指しているとすると、p-> nextはCを指し、p-> prevはAを指します。
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);