线性表之--链表、栈、队列

前言:基本的数据结构分类


        


  其中,Hash属于散列存储结构。顺序表在内存中是连续的存储空间;而链式在内存中是逻辑上连续,但空间上可以不连续的。今天来介绍一下线性表。


1、线性表分类


  链表分为单链表、循环链表和双链表、栈和队列等。


2、单链表


   


  单链表节点由数据域和指针域组成,数据域用于存放数据,指针域用于存储下一个节点地址。也可以知道,单链表只能向下查找。

  头结点:无论链表是否为空,头结点始终存在,头结点中的值域与链表元素无关。头指针始终指向头结点。

不带头结点的链表,头指针是指向头元素,在对链表进行删除、插入操作时,需要检测头元素是否发生了变化,否则会造成异常。而采用带头结点的链表,头指针指向一个始终存在且不改变的头结点,不需要进行多余的检测。


   单链表删除操作:例如删除a2:那么直接把a1节点的指针域指向a3节点,然后释放a2节点资源即可


     


   单链表添加操作:例如在a1与a2之间插入s节点:


     

  必须首先将s指向a2(即将a1.next赋值给s.next),然后将a1指向s。如果先将a1指向s,那么将丢失a2以及后续节点。


3、循环链表


     


  单链表最后一个元素的指针域为空,循环链表和单链表唯一的区别就是最后一个元素的指针域指向头结点,从而形成了一个环路。


4、双链表


     


  双链表因为有两个指针域,一个指向前驱结点,一个指向后继节点,所以双链表能够双向移动,它的灵活度要大于单链表,但是增加了内存开支。


   双链表删除操作:例如删除a2,直接将a1指向a3,a3指向a1,然后释放a2节点即可。


     


   双链表添加操作:例如在a1和a2之间添加x节点,首先将x的右指针指向a2,左指针指向a1,然后a1指向x,a2指向x即可。


     


  通过添加可发现,不论是单链表还是双链表,都要首先完成新节点的任务,然后才能完成旧节点的任务,否则会出现节点丢失的现象。


5、顺序表与链表的比较


     


   存储密度:顺序存储中,每一个存储单位存储一个数据,存储密度为1;而链式存储中,需要额外的存储空间充当指针域,增大了开支,使得村粗密度小于1.

   容量分配:顺序存储中,容量需要提前分配好,而且是连续的;而链式存储可以动态改变,可以使不连续的。

   查找运算:都要从头进行查找(二分查找除外),所以查找运算相同。

   读运算:顺序存储可以根据角标(地址)直接定位,而链式存储必须从头查找。

   插入运算:插入删除时数组最慢,详细解释请点击这里《浅谈数据结构


6、栈


  栈结构在之前的《浅谈数据结构也详细讲过,特点主要是先进后出。同时一个元素进栈后也能够立即弹栈(出栈)。例如数据按1,2,3,4入栈,出栈顺序有哪些呢,是不是只有4,3,2,1?不是的,也可能按照1,2,3,4出栈,即有的元素刚进栈就弹栈。 


7、队列


  在《浅谈数据结构中同样讲过,队列的特点是先进先出,这里注重讲一下循环队列。


      


  循环队列中最后一个空间不存放数据,同时有队头指针和队尾指针,头指针指向第一个元素,队尾指针指向最后一个空地址。所以当Tail + 1 = Head 时,定为队满。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值