数据结构第二章(2)

三、双链表:

为克服单链表访问前驱结点时间复杂度为O(n)的缺点,引入双链表。

双链表有两个指针域,一个指向直接后继(next),一个指向直接前驱(prior)

双链表的按值查找和按位查找的操作与单链表相同。

双链表的插入操作:若要插入第i个位置,就要找到第i-1的结点,先将第i-1结点的后继指针域内容赋值给新结点的后继指针域,再将新结点的地址存入第i结点的前驱指针域,接着将第i-1的结点地址存入新结点的前驱指针域,最后将新结点的地址存入第i-1结点的后继指针域。

双链表的删除操作:若要删除第i个结点,就要找到第i-1个结点和第i+1个结点,先将第i个结点的后继指针域赋值给第i-1个结点的后继指针域,再将第i+1个指针的前驱指针域中存入第i-1个结点的地址,最后释放掉第i个结点的内存空间即可。

四、循环链表:1/循环单链表。2/循环双链表

循环单链表:

和单链表的区别在于:

1/表中最后一个结点的指针不是NULL,而是改指为头结点,从而形成一个环。

2/在循环单链表中,表尾结点指向头指针,因此,若尾结点等于头指针,则代表已将循环一圈。

3/在任何位置插入和删除操作都是等价,无须判断表尾。

4/单链表只能从表头结点开始顺序遍历整个链表,而循环链表可以从表中的任意一个结点开始遍历整个链表

5/可以对循环单链表不设头指针,近设尾指针,使操作效率更高效。(若头指针存在,则对表尾操作要花费O(n)的时间复杂度,若设尾指针,那么尾指针的指针域即为头指针,对表头和表尾进行操作只需O(1)的时间复杂度)

循环双链表:

1/头结点的前驱结点指向表尾结点,表尾结点的指针域指向头指针

2/当循环双链表为空表时,头结点的前驱指针域和后继指针域都为头结点本身。

五、静态链表:

1/借助数组说明,数组a[0]表示头结点,它的指针域指示链表的第一个结点,这里的指针是结点的相对地址(数组下标),又称游标(cur)。

2/和顺序表一样,需要预先分配一块连续的内存地址。

3/静态链表以next==-1作为结束的标志。

4/插入,删除操作与动态链表相同,只需修改指针,不需移动元素。

ps:

顺序表和链表的比较:

顺序表可以顺序存取也可以随机存取,链表只能从表头顺序存取元素。

对于按值查找,顺序表无序时,顺序表和链表的时间复杂度为O(n),顺序表有序时,可采用折半查找,此时顺序表的时间复杂度为O(log2 n) 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值