From 600d464264fa38b7bfb2efe7f3eb2433c829346f Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 24 Jun 2021 14:21:40 +0800 Subject: [PATCH] add:datastruct static chained linear list --- ...astruct-static-chained-linear-list copy.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 _posts/2020-06-10-datastruct-static-chained-linear-list copy.md diff --git a/_posts/2020-06-10-datastruct-static-chained-linear-list copy.md b/_posts/2020-06-10-datastruct-static-chained-linear-list copy.md new file mode 100644 index 0000000..8c50741 --- /dev/null +++ b/_posts/2020-06-10-datastruct-static-chained-linear-list copy.md @@ -0,0 +1,32 @@ +--- +layout: post +title: "大话数据结构:线性表的链式存储结构——循环链表" +date: 2020-06-11 10:01:08 +author: "Viletyy" +header-style: text +tags: + - 数据结构 +--- +## 循环链表 +将单链表中终端结点的指针端由空指针改为指向头结点,就使得整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称**循环链表**(circular linked list) + +其实循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否空,现在则是p->next不等于头结点,则循环未结束。 + +在单链表中,我们有了头结点时,我们可以用O(1)的时间访问第一个结点,但对于要访问到最后一个结点,却需要O(n)时间,因为我们需要将单链表全部扫描一遍。 + +在循环链表中,不用头指针,二十用指向终端结点的尾指针来表示循环链表,此时查找开始结点和终端结点都很方便了。 + +终端结点用尾指针rear指示,则查找终端结点是O(1),而开始结点,其实就是rear->next->next,其时间复杂也为O(1) + +### 合并两个循环链表 +```c +p = rearA->next; /*保存A链表的头结点*/ +rearA->next=rearB->next->next; /*将本是指向B链表的第一个结点赋值给rearA->next*/ +rearB->next=p /*将原A链表的头结点赋值给rearB->next*/ +free(p); /*释放p*/ +``` + + +参考资料: + +- [大话数据结构]() \ No newline at end of file