用Java实现,数据结构-链表的增删改查
- 链表介绍
- 链表
- 单链表
- 双向链表
- 实现过程
- 代码
- 实现结果
链表介绍
链表
- 概述:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。
- 特点:使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
- 存储方式:数据域(当前节点的数值),指针域(存储下一个节点的位置)。
单链表
- 概述:单链表是链表中结构最简单的。一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分(next)存储下一个节点的地址。最后一个节点存储地址的部分指向空值(null)。
- 特点:单向链表只可向一个方向遍历,一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。而插入一个节点,对于单向链表,我们只提供在链表头插入,只需要将当前插入的节点设置为头节点,next指向原头节点即可。删除一个节点,我们将该节点的上一个节点的next指向该节点的下一个节点。
双向链表
- 概述:顾名思义双向链表它可以从两个方向对链表进行操作,它即具有头结点又具有尾结点。
- 特点:对于单项链表,我们如果想在尾部添加一个节点,那么必须从头部一直遍历到尾部,找到尾节点,然后在尾节点后面插入一个节点。这样操作很麻烦,如果我们在设计链表的时候多个对尾节点的引用,那么会简单很多。
实现过程
代码
package qcby.linklist;
public class LinkListTest {
public int data = 666 ; //用来存储该节点的数据
public LinkListTest next; //用来存储下一个节点
//链表的增加
public void add(int data) {
if(next == null) {
//如果next为空,就给它赋值
next = new LinkListTest();
next.data = data;
}else {
//如果不为空,就让下一个节点调用增加方法
next.add(data);
}
}
/**
* 链表的删除
*/
public void delete(int data) { //删除的实质是:把想删除的这个节点跳过,让想删除的这个节点的next(地址)指向想删除节点的下一个节点的地址名
if(next == null) {
return; //如果下一个为空则程序退出
}
LinkListTest temp = next;
if(temp.data == data) {
next = temp.next;
temp.next = null; //temp.next:指代的是节点的地址,地址了想删除的节点就会自动变为空
}else {
next.delete(data);
}
}
/**
* 链表的查找
*/
public LinkListTest find(int data) {
if(next == null) {
return null;
}
if(next.data == data) {
return next;
}else {
return next.find(data);
}
}
/**
* 链表的更新
*/
public void update(int data,int newdata) {
LinkListTest c = find(data);
c.data = newdata;
}
//toString方法:让链表以Jason语句的形式返回
@Override
public String toString() {
return "LinkListTest [data=" + data + ", next=" + next + "]";
}
实现结果
- main方法
package qcby.linklist;
public class LinkListTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkListTest a = new LinkListTest();
//调用链表的增加方法
a.add(5);
a.add(6);
a.add(59);
a.add(-5);
a.add(2);
a.add(666);
a.add(87);
System.err.println("增加结果");
System.out.println(a);
//调用链表的删除方法
a.delete(6);
System.err.println("删除结果");
System.out.println(a);
//调用链表的查找方法
LinkListTest b = a.find(2);
System.err.println("查找结果");
System.out.println(b);
//调用链表的修改方法
a.update(5, 5000);
System.err.println("修改结果");
System.out.println(a);
}
}
- 结果
增加结果
LinkListTest [data=666, next=LinkListTest [data=5, next=LinkListTest [data=6, next=LinkListTest [data=59, next=LinkListTest [data=-5, next=LinkListTest [data=2, next=LinkListTest [data=666, next=LinkListTest [data=87, next=null]]]]]]]]
删除结果
LinkListTest [data=666, next=LinkListTest [data=5, next=LinkListTest [data=59, next=LinkListTest [data=-5, next=LinkListTest [data=2, next=LinkListTest [data=666, next=LinkListTest [data=87, next=null]]]]]]]
查找结果
LinkListTest [data=2, next=LinkListTest [data=666, next=LinkListTest [data=87, next=null]]]
修改结果
LinkListTest [data=666, next=LinkListTest [data=5000, next=LinkListTest [data=59, next=LinkListTest [data=-5, next=LinkListTest [data=2, next=LinkListTest [data=666, next=LinkListTest [data=87, next=null]]]]]]]