链表

链表结构

链表将一组零散的内存块串联起来使用。
常见的链表结构有单链表、双向链表、循环链表。
单链表中有两个节点比较特殊:头节点和尾节点,头节点是第一个节点,记录链表的基地址,尾结点指向一个空地址NULL。
在这里插入图片描述
插入和删除的时间复杂度都为O(1),随机访问查找的时间平均时间复杂度为O(n)
循环链表和单链表的区别在于,单链表的尾结点指向链表的头节点

双向链表和单链表的区别在于,多个一个存储上一个节点地址的空间
在这里插入图片描述
删除操作两种情况:一种是删除等于某个值的节点,另一种是删除指针指向的某个节点

第一种情况,单链表和双向链表时间复杂度都为O(n)
第二种情况,单链表是O(n),因为需要遍历知道前驱节点,双向链表因为本身存储了这个数据,所以是O(1)
LinkHashMap底层用的就是双向链表这个结构,用的是空间换时间的设计思想,在不同的场景用,要合理利用空间和时间这两个维度去选择最合适的数据结构和算法。
和数组相比,链表更适合插入、删除操作频繁的场景,查找的时间复杂度较高,数组和链表的插入删除、查找的操作时间正好相反

基于单链表实现LRU算法的思路

在这里插入图片描述

链表书写注意

  1. 理解指针或引用的含义
    指针或者引用都是存储所指向对象的内存地址,将某个变量赋值给指针,就是将这个变量的地址给指针,指针可以通过这个地址找到这个变量
    p->next=q;意思就是p的指针中存储了q节点的内存地址
    p->next=p->next->next;p的指针存储了p节点的下下一个节点的内存地址
  2. 警惕指针丢失和内存泄漏
    插入操作的时候注意操作顺序,x->next=b;p->next=x;

在这里插入图片描述
删除节点的时候,针对某些语言,需要手动释放空间
3. 哨兵优化代码
在处理头尾边界问题上,不带头链表需要特殊处理,带头链表可以简化为一般操作,不用关注边界问题
4. 边界条件处理
1 链表个数为null、一个、两个
2 头尾操作
5. 画图思考
画图更清晰
6. 多写多练
重复做,多思考

发布了224 篇原创文章 · 获赞 37 · 访问量 18万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览