1
0
mirror of https://github.com/142vip/408CSFamily.git synced 2026-04-05 03:27:57 +08:00
Files
408CSFamily/docs/DataStructure/linear_table/5.circular_list.md
mmdapl 42117a0dd9 init
2022-04-08 00:10:38 +08:00

2.4 KiB
Raw Blame History

循环链表

  • 循环单链表
  • 循环双链表

循环单链表

循环单链表是在单链表的基础上,将最后一个结点(尾结点)的指针由NULL改为指向头结点,形成。【单链表----->循环单链表】

// 双链表结点类型
typedef struct DNode{
    ElemType data;          // 结点的数据域
    struct DNode *prior;    // 结点的前驱指针
    struct DNode *next;     // 结点的后继指针
}DNode, *DlinkList;

判空条件

不是判断头结点的指针是否为空,而是需要判断是否等于头指针表为空时头结点的next指针域其实是指向自己

特点

  • 在循环单链表中,尾结点*p的next指针域指向链表L头结点形成了闭环,不存在指针域为NULL的结点。
  • 由于循环单链表是个,在任何位置上的插入、删除操作都是等价的,不需要去判断是否是表尾。当其中的结点的next指针指向自己也就能判断表为空
  • 单链表只能从头结点(表头结点)开始往后顺序遍历整个表,循环单链表可以从表中任意位置开始遍历整个链表,结点是等价的;
  • 循环单链表可以抽象为时钟,形成的是有顺序的;
  • 频繁的表头表尾操作,可以对循环单链表设置尾指针,而不设置头指针明确尾指针r后头指针即为r->next ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1)

循环双链表

循环双链表是在双链表的基础上,将尾结点next指针指向头结点,将头结点prior指针指向尾结点。【双链表----->循环双链表】

// 双链表结点类型
typedef struct DNode{
    ElemType data;          // 结点的数据域
    struct DNode *prior;    // 结点的前驱指针
    struct DNode *next;     // 结点的后继指针
}DNode, *DlinkList;

判空条件

循环双链表为空时,头结点*p的prior指针和next指针都指向L即同时满足

  • p->next=L
  • p->prior=L

基本特点

  • 从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点后继结点