循环链表
- 单链表是一种具有方向性的结构,只能从头结点出发,依次去访问各个结点.
- 如果头结点被破坏或丢失,则整个单链表就会丢失,并且所占内存无法释放.
- 把单链表的尾结点指向头结点,使整个链表构成一个环状机构,称为循环链表(circle list)
循环链表的结点删除
根据删除结点的位置和结点个数,删除一个结点分三种情况:
(1) 结点个数=1,删除头结点
head = NULL;
delete DelNode;
(2) 结点个数>1,删除头结点
p = head;
while (p->next! = head) //探测指针p找到head的前一个结点
p = p->next;
head = head->next;
p->next = head;
delete DelNode;
(3) 结点个数>1,删除非头结点
p = head;
while (p->next! = DelNode) //探测指针p找到DelNode的前一个结点
p = p->next;
p->next = DelNode->next;
delete DelNode;
循环链表的结点插入
将结点InsNode插入到结点PosNode之后:
(1) InsNode插入到head的之前
InsNode->next = head;
Node *p = head;
while (p->next != head)
p=p->next;
head = InsNode;
p->next = head;
(2) 将结点InsNode插入到结点PosNode之后
InsNode->next = PosNode->next;
PosNode->next = InsNode;
双向链表
结点的逻辑结构:
[ *link | data | *rlink]
- 双向链表中的结点设置了三个域:
- 一个数据域data用来存放结点数据信息
- 两个指针域*link指向前一个结点, *rlink指向后一个结点.
- 头结点 ->llink = NULL;
- 尾结点 ->rlink = NULL;
双向链表的结点删除
根据删除结点的位置和结点个数,删除一个结点分四种情况:
(1) 结点个数=1,删除头结点
head = NULL;
delete DelNode;
(2) 结点个数>1,删除头结点
head = head->rlink;
head->llink = NULL;
delete DelNode;
(3) 结点个数>1,删除尾结点
DelNode->llink->rlink = NULL;
delete DelNode;
(4) 结点个数>1,删除中间结点
DelNode->rlink->llink = DelNode->llink;
DelNode->llink->rlink = DelNode->rlink;
delete DelNode;
双向链表的结点插入
将结点InsNode插入到结点PosNode之后:
(1) InsNode插入到head的之前
head->llink = InsNode;
InsNode->rlink = head;
head = InsNode;
head->llink = NULL;
(2) 将结点InsNode插入到结点PosNode之后
PosNode->rlink->llink = PosNode;
InsNode->llink = PosNode;
InsNode->rlink = PosNode->rlink;
PosNode->rlink = InsNode;
写于 2020-10-15