【java基础】基础数据结构

本文深入讲解数据结构基础知识,包括顺序表和链表的特性及应用,分析不同操作的时间复杂度,探讨顺序表与链表的选择策略,以及链表的常见算法如环检测、逆置、合并有序链表等。

基础数据结构

顺序表

ArrayList :数组 ,初始化大小10,扩容element.length+(element.length>>1)

数据存储:头插 O(n)尾插O(1) 任意位置插 O(n) (分析时间复杂度(平均))
数据删除:头删 O(n)尾删O(1) 任意位置删O(n) (分析时间复杂度)

顺序表和数组的区别?
顺序表底层采用数组实现;
顺序表可以扩容 底层封装了实现 用户不必在意细节;

链表

(增删改查)
单向链表: 两个域构成:value next
双向链表 : 三个域 (value next pre)头部的pre为null 尾部的next为null
单向循环链表:两个域 (value next) 尾巴的next域指向head
双向循环链表:基本不用

顺序表和链表的选择?

存储数据(时间效率)
尾插 尾删 ->顺序表实现
头插 头删 尾插->链表
head tail 标记: 头插O(1) 尾插O(1) 头删O(1) 尾删O(n)(找前驱)
链表不会涉及到扩容 需要重新开辟内存 涉及内存释放问题 垃圾回收器遵循垃圾回收机制

链表相关的操作:

1、链表是否存在环
快慢引用(两个标记)快一次走二个格子 慢一次走一个格子 如果最后两个引用相遇说明此时存在环
2、如果存在环 环的入口节点
相遇点不一定是入口点,(找路程之间的关系)慢*2=快
在这里插入图片描述
在这里插入图片描述
在相遇点处定义一个q,再定义一个p 从头结点开始,两个指针同时向后走,每次向后走一格,当q==p时。则为环的入口点
3、链表逆置
不建议:调用remove,add 方法(会增加空间复杂度)
推荐:三个引用变量(next域逆向):
p q s
while(){
q.next=p;
p=q;
q=s;
s=s.next;
}//更新头部 尾部
4、输出倒数第k个节点
验证k是否合法(参数安全检测)
1):走size-k步
2)(时间复杂度低):p先走k步 q从头开始走
然后pq同时向后走 p走到尾部 q所指向是节点就是倒数第k个
5、两个有序单链表合并为一个有序单链表
比较两个链表的头结点大小 小的为头
比较新头的下一个与另一个链表的大小
谁先链完将后面的节点全部链接过来:

6、两个链表相交,输出相交节点
1)双重for循环 时间复杂度O(n*m)O(n^2)
2)统计长链表的长度n 短链表m 长链表先走n-m步 此时pq同时向后走,相等的节点则为相交节点O(2(n+m))

二分查找
Arrays.binarySeach();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值