Ich sys/queue.h
von FreeBSD zu studieren, und ich habe eine Frage:Warum behält die doppelt verknüpfte Liste in sys/queue.h die Adresse des vorherigen nächsten Elements?
In sys/queue.h
wird LIST_ENTRY
wie folgt definiert:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
Warum es die Adresse des vorherigen nächsten Elements wird beibehalten (struct type **le_prev
) anstatt einfach vorherige elment wie struct type *le_prev
?
Meinst du, dass diese Implementierung Rückwärtspaar sowie O (1) einfügen und löschen verhindern soll? –
@YanzheChen Die Komplexität von (linearen) Listenoperationen ändert sich nicht, wenn Sie einen einzelnen Zeiger verwenden und der Doppelzeiger Rückwärtsdurchlauf nicht verhindert. Ich denke, der wichtige Teil ist "oder eine Reihe von Vorwärtszeigern"; Wenn eine solche (Hash-) Tabelle vorliegt, ist die Entfernung billiger, wenn die Adresse des vorherigen Zeigers gespeichert ist. – ensc
@ensc Ich lese das [post] (http://stackoverflow.com/questions/9362896/deleting-any-node-from-a-single-linked-list-when-only-pointer-to-that-node- is-gi) und verstehen, dass die Deletion in der single-linked-Liste in O (1) erreicht werden kann, wenn es nicht der Endknoten ist. Aber warum verhindert der Doppelzeiger ** nicht ** Rückwärtslaufen? Wie führe ich den Rückwärtsdurchlauf durch? Und ich verstehe nicht den wichtigen Teil, den du erwähnt hast. Können Sie das näher erläutern? –