循环链表
将单链表的首尾相接,将终端节点的指针域由空指针改为指向头节点,构成单循环链表,称之为循环链表。
空循环链表是头结点指针指向头结点。
非空循环链表,由头结点指向非头结点的元素:
空表和非空表的处理都需要附加头结点。
插入结点:设需要在第三个结点处插入一个结点,将设定的值x赋给结点S,第二位的结点设为P结点,P结点指针域原来指向的后继结点赋给S结点的指针域,P重新指向S结点。
代码实现:
void Insert(int i , ElemType x){
P = L; j = 0;
while(p! = L && j<i-1){ //遍历链表,查找目标位置
p = p->next;
j++;
}
if(p == null)
return 0;
else{ //在指定位置插入结点
s = (List)malloc(sizeof(struct LNode));
s->data = x;
s->next = p->next;
p->next = s;
}
}
循环链表的循环条件:p!=L; //当不为表头指针一直循环
查找开始结点与终端结点:
开始结点:L->next
扫描二维码关注公众号,回复:
10642371 查看本文章
终端结点:将单链表遍历一遍,直到达到表的长度,时间复杂度为O(n)。
带尾指针的循环链表
开始结点:rear->next->next
终端结点:rear