使用JAVA实现单向链表增删改查操作
链表的定义
(1)链表是以节点的方式来存储的,是链式存储,在内存中不一定是连续存储
(2)每个节点包含data域,next域:指向下一个节点
(3)链表分带头结点的链表和没有头结点的链表,根据实际的需求来确定
单链表结构分析
(1)首先我们来看链表的结构
头结点为空不设置内容,使其(next域)指向下一节点,链表尾部的(next域)指向空,在链表尾部添加节点只需要将链表尾部的(next域)指向新节点即可。
(2)接下来是链表在内存中的存储方式。
在内存中可以看出链表的存储方式不一定是按照添加顺序而进行顺序存储的,而是通过(next域)来查找到下一节点
链表的实现
(1)定义节点:
代码:
//定义节点
class Node{
//这里的public 是因为LinkedList链表操作类会使用到
//不用get,set,方便使用;
public int no;//排名
public String name;//姓名
public Node next;//节点域指向下一个节点
public Node(int no,String name){
this.no=no;
this.name=name;
}
@Override
public String toString() {
return "Node【" + "排名:" + no +
"\t姓名:" + name +
'】';
}
}
上述代码中,每一个节点中(data域)中数据包含[ 排名,姓名 ],在定义头结点时(data域)中数据必须全部为空。
(2)定义链表操作类
代码:
class LinkedList{
//定义头结点,内容为空,不存放数据
private Node headNode=new Node(0,"");
//添加数据,普通添加在链表尾部
public void addList(Node data){
//避免直接操作头结点,采取引用
Node node=headNode;
while (true){//循环遍历找到链表尾部
if(node.next==null){
//找到尾节点
break;
}
//否则遍历下一个节点
node=node.next;
}
//将节点域指向存放数据
node.next=data;
}
//添加数据,按排名顺序插入添加
public void addListByNo(Node data){
boolean temp=false;//默认链表中无相同排名数据;
Node nodeData=headNode;
while (true){//循环遍历,查找条件
if(nodeData.next==null){
//nodeData为链表尾
break;
}
if (nodeData.next.no>data.no){
//nodeData下一节点排名>插入节点排名
break;
}else if(nodeData.next.no==data.no){
//排名已存在
temp=true;
break;
}
//所有判断都不符合,判断下一节点
nodeData=nodeData.next;
}
if(temp==true){
System.out.println("所插入数据排名已存在");
return;
}else {
//新排名数据插入适合位置
data.next=nodeData.next;
nodeData.next=data;
}
}
//删除指定排名节点
public void removeListByNo(int no){
Node node=headNode;//初始化操作节点
while (true){
if(node.next.no==no){
break;
}
if(node.next==null&&node.no!=no){
System.out.println("您要删除的节点不在链表中");
}
node=node.next;
}
node.next=node.next.next;
}
//更改指定排名节点
public void updateList(int num,Node data){
Node flag=headNode.next;
while (true){
if(headNode.next==null){
System.out.println("链表为空,无法进行操作");
break;
}
if(flag.no==num){
break;
}else if(flag.next==null&&flag.no!=num){
System.out.println("您要修改的数据不在链表中");
break;
}
flag=flag.next;
}
flag.no=data.no;
flag.name=data.name;
//将修改信息的节点重新排序
addListByNo(flag);
}
//遍历
public void showList(){
if(headNode.next==null){
System.out.println("这是一个空链表");
return;
}
Node nextNode=headNode.next;
while (true){
System.out.println(nextNode);
if(nextNode.next==null){
break;
}
nextNode=nextNode.next;
}
}
}