这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战
前言
循环链表和单链表没有本质上的差别。唯一不同的链表的最后不再是空的了,而是指向了first头指针。只有这样我们才会实现链表的循环功能,那么问题来了,我们在下面的函数功能中我们只是需要把里面用的头指针的重用名换到first->next中,而且其中的计数器count也从1开始计数,这样就避免了在while的循环中第一步实行不下去。废话不多说。
循环链表
链表的两头连接,形成了一个环状链表,称为循环链表。
-
这个很好理解,就是在我们之前的单链表的基础上让头结点和尾节点进行关联,这样就形成了一个闭环了。
-
实际上在循环链表中就没有具体的头结点和尾节点了。因为他们都是循环链表中的一员里 。在最近很火的美剧洛基中征服者康对时间的定义就是一个环形。很是符合我们的循环链表的概念。
整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”。
如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率。
为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额外配备一个指针变量,用于指向每个结点的直接前趋元素。这样的链表被称为“双向链表”或者“双链表”。
双链表删除结点时,直接遍历链表,找到要删除的结点,然后利用该结点的两个指针域完成删除操作。
在(1,4,2,3)中删除结点 2:
//删除结点的函数,data为要删除结点的数据域的值
line * delLine(line * head,int data){
line * temp=head;
//遍历链表
while (temp) {
//判断当前结点中数据域和data是否相等,若相等,摘除该结点
if (temp->data==data) {
temp->prior->next=temp->next;
temp->next->prior=temp->prior;
free(temp);
return head;
}
temp=temp->next;
}
printf("链表中无该数据元素");
return head;
}
总结
- 循环的好处就是我们不需要担心结束了。但这正是我们的一个缺点。小心造成死循环