Java中的链表
简单的讲一下Java中如何创建一个链表以及对其进行基本的增删改插。
数据结构如下:
一个节点Node中包含有数据data和指向下一个节点的链表类指针next。
其中尾节点的next为空(null),以表示链表结束。
链表的定义
首先我们需要定义一个链表类,这里我自己写的val是int整型数类型,你可以根据自己的需求更换数据类型(char,String,double,etc)。
代码如下:
class LinkNode//链表定义
{
public int val;//值域
LinkNode next = null;//指向下一个节点
public LinkNode(int val)//对值域进行传值
{
this.val=val;
}
}
LinkNode head = null;//得到头节点
LinkNode current = null;//当前节点(工具人节点)
链表的创建
有了基本的链表定义后,我们就可以创建一个链表了。
在主函数中我们将使用for循环一步完成创建,如不明白请移步至完整代码。
代码如下:
public void createList(int val)//链表的创建
{
if(head == null)//空链表时
{
head = new LinkNode(val);
current = head;
}
else//链表已经存在元素了
{
LinkNode node = new LinkNode(val);
current.next = node;
current = current.next;
}
}
链表的遍历
依次访问每一个节点,输出每一个节点的val,然后执行current= current.next以实现当前指针的下移。
代码如下:
public void print()//打印函数(遍历链表)
{
if(head == null)//防止链表为空
throw new IllegalArgumentException("您还未创建链表!");
current = head;
int i = 1;
while(current != null)
{
System.out.println("第"+i+"号元素:"+" "+current.val);
i++;
current = current.next;
}
}
链表元素添加
接下来我们为链表添加元素,添加方法为在其表尾加一个节点。
如果要实现在其表头或其他位置添加元素,详见链表元素插入。
代码如下:
public void add()//添加函数
{
if(head == null)//防止链表为空
throw new IllegalArgumentException("您还未创建链表!");
print();//添加的链表展示
System.out.println("请输入你想添加的元素:");
int num;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
sc.close();
current = head;
while(current.next != null)//得到尾节点
{
current = current.next;
}
LinkNode node = new LinkNode(num);
current.next = node;
System.out.println("添加后:");
print();//添加后的链表展示
}
链表元素插入
这里我们需要分情况讨论,如果你是在表头head前插入元素的话,此时head将会发生改变。
当你在其他位置插入时,需要把插入前后的节点Node连起来。
代码如下:
public void insert()//插入函数
{
if(head == null)//防止链表为空
throw new IllegalArgumentException("您还未创建链表!");
print();//插入前的展示
System.out.println("请输入你想插入的元素的值和位置(PS:插入功能指插入到某个元素之前):");
int num,j;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();//读取你要插入的元素的val
j = sc.nextInt();//读取你要插入的位置
sc.close();
current = head;
LinkNode previousNode = null;//用于记录current的前一个节点
for(int i=1;current != null;i++)
{
if(j == 1)//当你要插入头节点时
{
LinkNode node = new LinkNode(num);
node.next = head;//节点连接
head = node;//头节点转移
System.out.println("插入后:");
print();
break;
}
if(i == j)//当你需要插入其他节点之间时
{
LinkNode node = new LinkNode(num);
previousNode.next = node;//前一个节点与新节点相连
node.next = current;//新节点的next指向插入位置
System.out.println("插入后:");
print();
break;
}
previousNode = current;
current = current.next;
}
}
链表元素删除
和链表插入一样,我们同样需要对删除的位置进行讨论。
这个功能的实现,需要我们找到需要删除的节点具体位置。然后连接前一个节点和后一个节点即可。如图所示:
代码如下:
public void delete()//插入函数
{
if(head == null)//防止链表为空
throw new IllegalArgumentException("您还未创建链表!");
print();//删除前展示
System.out.println("请输入你想删除的元素的位置:");
int j;
Scanner sc = new Scanner(System.in);
j = sc.nextInt();
sc.close();
current = head;
LinkNode previousNode = null;//声明一个先前节点
for(int i=1;current != null;i++)
{
if(j == 1)//需要删除头节点时
{
head = head.next;//头节点下移
System.out.println("删除后:");
print();
break;
}
if(i == j)//删除其他位置
{
previousNode.next = current.next;//先前节点与下一个节点相连
System.out.println("删除后:");
print();
break;
}
previousNode = current;
current = current.next;
}
}
链表元素修改
这个很简单,我们的思路就是找它然后改变它。
public void modify()
{
if(head == null)//防止链表为空
throw new IllegalArgumentException("您还未创建链表!");
print();
System.out.println("请输入你想修改为的值及其位置:");
int num,j;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();//接收要改为值
j = sc.nextInt();//接收修改的位置
sc.close();
current = head;
for(int i=1;current != null;i++)
{
if(i == j)
{
current.val = num;//改值
System.out.println("修改后:");
print();
break;
}
current = current.next;
}
}
完整代码
注:链表类中需要使用import语句导入如下包,否则键盘输入将无法使用
import java.util.Scanner;
public class MainFunction {
public static void main(String[] args) {
LinkList list = new LinkList();
for(int i = 0;i<10;i++)
{
list.createList(i);//链表初始化
}
list.add();
list.modify();
list.delete();
list.insert();
}
}
public class LinkList {
class LinkNode//链表定义
{
public int val;
LinkNode next = null;
public LinkNode(int val)//对值域进行传值
{
this.val=val;
}
}
LinkNode head = null;
LinkNode current = null;
public void createList(int val)//链表的创建
{
if(head == null)
{
head = new LinkNode(val);
current = head;
}
else
{
LinkNode node = new LinkNode(val);
current.next = node;
current = current.next;
}
}
public void modify()
{
if(head == null)
throw new IllegalArgumentException("您还未创建链表!");
print();
System.out.println("请输入你想修改为的值及其位置:");
int num,j;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
j = sc.nextInt();
sc.close();
current = head;
for(int i=1;current != null;i++)
{
if(i == j)
{
current.val = num;
System.out.println("修改后:");
print();
break;
}
current = current.next;
}
}
public void add()//添加函数
{
if(head == null)
throw new IllegalArgumentException("您还未创建链表!");
print();
System.out.println("请输入你想添加的元素:");
int num;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
sc.close();
current = head;
while(current.next != null)//得到尾节点
{
current = current.next;
}
LinkNode node = new LinkNode(num);
current.next = node;
System.out.println("添加后:");
print();
}
public void insert()//插入函数
{
if(head == null)
throw new IllegalArgumentException("您还未创建链表!");
print();
System.out.println("请输入你想插入的元素和位置(PS:插入功能指插入到某个元素之前):");
int num,j;
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
j = sc.nextInt();
sc.close();
current = head;
LinkNode previousNode = null;
for(int i=1;current != null;i++)
{
if(j == 1)
{
LinkNode node = new LinkNode(num);
node.next = head;
head = node;
System.out.println("插入后:");
print();
break;
}
if(i == j)
{
LinkNode node = new LinkNode(num);
previousNode.next = node;
node.next = current;
System.out.println("添加后:");
print();
break;
}
previousNode = current;
current = current.next;
}
}
public void delete()//插入函数
{
if(head == null)
throw new IllegalArgumentException("您还未创建链表!");
print();
System.out.println("请输入你想删除的元素的位置:");
int j;
Scanner sc = new Scanner(System.in);
j = sc.nextInt();
sc.close();
current = head;
LinkNode previousNode = null;
for(int i=1;current != null;i++)
{
if(j == 1)
{
head = head.next;
System.out.println("删除后:");
print();
break;
}
if(i == j)
{
previousNode.next = current.next;
System.out.println("删除后:");
print();
break;
}
previousNode = current;
current = current.next;
}
}
public void print()//打印函数(遍历链表)
{
if(head == null)
throw new IllegalArgumentException("您还未创建链表!");
current = head;
int i = 1;
while(current != null)
{
System.out.println("第"+i+"号元素:"+" "+current.val);
i++;
current = current.next;
}
}
尾言
这就是Java的单链表实现了,有什么不懂的可以在评论区问我,正常情况下24小时之内能回复,大家一起进步嗷。
声明:本博客图片均为互联网资源