リニアテーブル構造:リスト(一方向、双方向、ループ)

   異なるリンクリスト、および配列連結リストは、連続したメモリ空間を必要としません示すように、それは、連続して使用されるメモリ・ブロックの断片化されたセットへの「ポインタ」です。

   

   リストの多くの種類がありますが、最も単純な単鎖である図の構造に示すように、単鎖は、ネイティブのリストです。

   

   単鎖は、二つの特別なノード、すなわち、最初のノードと最後のノードを持っています。通常、最初のノードと呼ばれる最初のノードを、最後のノードが呼び出されたテール・ノード前記レコードのリストの最初のノードのベースアドレスは、それを、得られたリスト全体をトラバースすることができます。エンド・ノードと特別な場所:ポインタは、次のノードを指しますが、ヌルアドレスNULLを指し、これはリストの最後のノードであることを示していません。単一のリストの観点から、理論的には、挿入時の複雑さとノードを削除する(n)は、(1)、クエリ・ノードの時間複雑度はOであり、Oであります

   その後の一本鎖伸長の基礎もある円形のリンクリストのテール・ノードに区別、円形のリンクリスト単一リンクリストポイントは、ビット蛇のように、最後まで終了するヘッドノードである「解くために使用することができるヨセフス」問題を、示すように、円形のリスト構造:

   

   此外,还有比较常见的双向链表,顾名思义,与单链表的区别是双向链表除了有一个指向下一个节点的指针外,还有一个用于指向上一个节点的指针,从而实现通过 O(1) 复杂度找到上一个节点。正是因为这个节点,使得双向链表在插入、删除节点时比单链表更高效,虽然我们前面已经提到单链表插入、删除时间复杂度已经是 O(1) 了,但是这没有考虑还只是针对插入、删除操作本身而言,以删除为例,删除某个节点后,需要将其前驱节点的指针指向被删除节点的下一个节点,这样,我们还需要获取其前驱节点,在单链表中获取前驱节点的时间复杂度是 O(n),所以综合来看单链表的删除、插入操作时间复杂度也是 O(n),而双向链表则不然,它有一个指针指向上一个节点,所以其插入和删除时间复杂度才是真正的 O(1)

   双向链表的结构如图所示:

   

   此外,对于有序链表而言,双向链表的查询效率显然也要高于单链表,不过更优的时间复杂度是靠更差的空间复杂度换取的,双向链表始终需要单链表的两倍空间,但是正如我们之前说的,在 Web 应用中,时间效率优先级更高,所以我们通常都是空间换时间来提高性能,Java 的 LinkedHashMap 底层就用到了双向链表。

   结合循环链表和双向链表为一体的双向循环链表

   

 

おすすめ

転載: www.cnblogs.com/mzhaox/p/11294107.html