链表

存储特点:1、零散内存空间和相同类型的数据 2、线性表(数据之间只有前后关系)

下标随机访问效率低()

链表特点:

 构成特点适用场景
单链表结点(数据+后继指针)

头结点:第一个结点(记录链表基地址)

尾结点:最后一个结点(指针指向NULL)

 
循环链表同上尾结点指针指向链表的头结点约瑟夫问题(丢手绢)
双向链表结点(前驱指针+数据+后继指针)  

                

复杂度分析:

 插入删除查询问题
单链表O(n)

O(n)   根据值查询,O(n)+删除O(1)

O(n)   根据结点删除,找前驱结点O(n)

随机访问O(n)

 

数组的效率高是因为内存地址连续

为什么有序单链表不能用二叉树?
循环链表    
双向链表O(1)

O(n)   根据值查询,O(n)+删除O(1)

O(1)   根据结点删除,找前驱结点O(1)

内存不连续只能一一比较 
双向循环列表    

 

数组和链表对比

 插入删除查询内存空间
数组O(n)

O(n)

随机访问O(1)连续(CPU缓存机制,可以预读)
链表O(1)O(n)O(n)零散(CPU缓存不友好,无法预读)

 

链表代码书写技巧

1、理解指针或引用的含义:将变量赋值给指针,就是把变量的地址赋值给指针,通过指针就能找到变量

2、防止指针丢失和内存泄漏(先将后面的后继结点赋值好,在赋值好前面的后继结点)

3、利用哨兵,可以节约效率(就是一个特定值)

4、边界条件处理

      如果链表为空时,代码是否能正常工作?

      如果链表只包含一个结点时,代码是否能正常工作?

      如果链表只包含两个结点时,代码是否能正常工作?

      代码逻辑在处理头结点和尾结点的时候,是否能正常工作?

 

5、举例画图,辅助思考

       单链表反转

       链表中环的检测

       两个有序的链表合并 

       删除链表倒数第 n 个结点

       求链表的中间结点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值