链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针实现的。链表由一系列结点组成,结点可以在运行时动态生成,而且由于没有闲置的内存,因此空间效率比数组高。其插入操作可达到O(1)复杂度,但是查找或者访问特定的结点复杂度是O(n)。
一、链表优点:
-
空间没有限制
-
插入删除元素很快
二、链表缺点:存取速度很慢
三、链表又分了好几类:
1、单向链表:一个节点指向下一个节点
2、双向链表:一个节点有两个指针域
3、循环链表能通过任何一个节点找到其他所有的节点,将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环
四、Java实现链表
算法:
-
遍历
-
查找
-
清空
-
销毁
-
求长度
-
排序
-
删除节点
-
插入节点
1、首先定义节点类:
public class LinearNode {
private LinearNode next; //用于指向下一个节点
private Object element;
//创建一个空节点
public LinearNode() {
next = null;
element = null;
}
//创建一个给定元素的节点
public LinearNode(Object element) {
next = null;
this.element = element;
}
public LinearNode getNext() {
return next;
}
public void setNext(LinearNode next) {
this.next = next;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
@Override
public String toString() {
return "{" +
"'" + element +
"'}";
}
}
2、定义链表类实现增、删
public class LinkedBag {
private int count; //记录当前节点在链表中的编号
private LinearNode contents; //链表中的元素
public LinkedBag() {
count = 0;
contents = null;
}
public int getCount() {
return count;
}
public LinearNode getContents() {
return contents;
}
//给链表中添加节点
public void add(Object element){
LinearNode node = new LinearNode(element);
node.setNext(contents);
contents = node;
count++;
}
//删除链表中的给定的节点
public Object remove(Object target){
boolean found = false;
LinearNode previous,current;
Object result = null;
if(contents.getElement().equals(target)){
result = contents.getElement();
contents = contents.getNext();
}else{
previous = contents;
current = contents.getNext();
for(int look=1;look<count&&!found;look++) {
if (current.getElement().equals(target)) {
found = true;
} else {
previous = current;
current = current.getNext();
}
if (!found) {
throw new NoSuchElementException();
}
result = current.getElement();
previous.setNext(current.getNext());
}
}
count--;
return result;
}
//遍历节点
public void next(LinkedBag bag)
{
LinearNode current = bag.getContents();
while(current != null){
System.out.print("--->"+current.getElement());
current = current.getNext();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现