定义:链表是一种递归的数据结构,他或者为空(null),或者是指向一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。
用长方形表示对象
将实例变量的值写在长方形中;
用指向被引用对象的箭头表示引用关系。
private class Node{
Item item;
Node next;
}
Node first = new Node();
Node second = new Node();
Node third = new Node();
first.item = "one";
second.item = "two";
third.item = "three";
然后我们设置next域来构造链表
first.next = second;
second.next = third;
注:此时third的next仍为null,即被初始化的值。
我们知道了如何构造链表,我们再来说一下链表的存储方式。
我们都知道数组在内存中是连续分布的,但是链表在内存不是连续分配的。链表是通过指针域的指针链接内存中的各个节点。
所以链表在内存中是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。我们可以根据下图来进行理解。
链表的遍历我们通常使用while循环(for循环也可以但是代码不够简洁)下面我们来看一下链表的遍历代码
for:
for(Node x = first;x!=null;x=x.next){
//处理x.item
}
while:
Node x = first;
while(x!=null){
//处理x.item
x=x.next;
}
添加节点E,如图所示
删除B节点,如图所示
我们只需将A节点的next指针指向C节点即可。
有的同学可能会有这种疑问,B节点这样不会留着内存里吗?java含有自己的内存回收机制,不用自己手动释放内存了,但是C++,则需要手动释放。
我们通过上图知道了删除和插入都是O(1)操作。
插入/删除操作(时间复杂度) | 查询(时间复杂度) | 存储方式 | |
---|---|---|---|
数组 | O(n) | O(1) | 内存连续分布 |
链表 | O(1) | O(n) | 内存散乱分布 |
我们上周做了很多链表的题目,全部都是在题库中精挑细选出来的,掌握了那些题目不仅能够掌握了链表的基本操作,而且还能学到很多算法思想,以后我们再遇到链表的题目就可以往我们的框架上靠。
链表必会题目:
双指针思想
老鹰:我要抓走倒数第K个小鸡
老鹰:一口气吃掉一半小鸡仔
兜兜转转还是你
遇见
合二为一
删除节点
我们长的像是我们的错吗?
大家完成了这些题目应该就会对链表有自己的理解了,对其他链表题目也不会一头雾水了,大家记得打卡呀。
树莓派Pico:仅4美元的MCU
嵌入式Linux开发板裸机程序烧写方法总结
国产16位MCU的痛点,可以用这款物美价廉产品