DS第三篇(下):线性表之链表——循环链表、双向链表、顺序表和链表的比较。

上接:DS第三篇(中):线性表之链表——单链表

开篇口水话:

无论是学习单链表、还是循环、双向链表,
掌握 节点的“增、删”操作很重要,难的就是指针域的指来指去
不能乱序

循环链表

1.单链循环链表,如此定义

  • 和单链表,大同小异
  • 也就是在单链表基础上,最后一个结点的指针域,指向头结点(或者第一个结点)

在这里插入图片描述

2.于是乎,循环链表可以

从任意节点出发,都可以遍历其他结点

但,不能死循环。
那么就让循环单链表,结束循环判别条件:p->next !=L / p!=L

类似的,还有多重链的循环链表…

3.单链循环链表的合并

比如有A、B两个单链循环链表(设A、B是指向“最后一个结点”的指针)

那么 A->next 就是头结点。同理,B表也有一个头结点

二者合并,需要去掉其中一个头结点。

参考code如下:

 	p = B->next -> next;
 	B->next = A->next;
 	A->next = p;

时间复杂度O(1)

双向链表

1.顾名思义

两个方向都link,
所以每个结点 除了 Data Field 还有 Prior Field 直接前驱Next Field 直接后继
在这里插入图片描述
结点的结构体定义

typedef struct DuLNode{
	ElemType data;
	struct DuLNode *next;
	struct DuLNode *prior;
}DuLNode, *DuLinkList;   

2.看图说话

在这里插入图片描述

L = L->next


在这里插入图片描述

设d是指向任意结点的指针,
那么, d = d->next->prior = d->prior->next

3.双向链表的“牵线”(增删结点,指针指向)

图是这样的:
在这里插入图片描述
在这里插入图片描述

难的是,考虑这四个步骤,前后顺序
第四步,放在最后,其他步骤可以随意。 自己好好感受吧~

代码如下

Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){		//双向链表的插入
	//在带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长+1
	DuLNode *s,*p;
	if(!(p=GetElemP_DuL(L,i)))				//在L中确定第i个元素的位置指针p
		return ERROR;						//p为NULL时,第i个元素不存在
	s=new DuLNode;							//生成新结点s
	s->data=e;								//将结点s数据置为e
	s->prior=p->prior;						//将结点s插入L中,需要修改4个指针域
	p->prior->next=s;
	s->next=p;
	p->prior=s;
	return OK;
}

类似的双向链表的删除

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){		//双向链表的删除
	//删除带头结点的双向链表L中第i个位置之前插入元素e,i的合法值为1<=i<=表长
	DuLNode *p;
	if(!(p=GetElemP_DuL(L,i)))				//在L中确定第i个元素的位置指针p
		return ERROR;						//p为NULL时,第i个元素不存在
	e=p->data;								//保存被删结点的数据域
	p->prior->next=p->next;					//修改被删结点的前驱结点的后继指针
	p->next->prior=p->prior;				//修改被删结点的后继结点的前驱指针
	delete p;								//释放被删结点的空间
	return OK;
}	

顺序表和链表的比较

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

adingable

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值