注意Java中没有指针,所以先定义一个节点node的类,包括一个整形数据data和一个包含自身的类似指针next
在新建对象的过程中一定要先声明,这点和C++不同,而且Java有自动回收的功能,也就是说new的对象不用自己删除
我在写函数的过程中因为引用无法使用,把对应的功能函数都写在了定义的链表类里面了,而且Java无法在类外声明对应的函数,就像用class名::函数名的这种,所以代码看起来很难受,请见谅。
这个链表基本的功能已经实现了,但是查找部分有缺陷,只能查找第一个相同的数,当还有相同的数存在则无法显示,删除也是这样的问题,解决思路是将while语句中的判断改为p.next != null,然后在循环内部加一个if语句来判断,并将结果存在一个数组里,但我不清楚Java在调用数组时返回该如何返回,而且也不能判断具体有多少个相同的数,所以这点一直改不了
其他的暂时没测试出什么问题,如果不出意外,链表这章就算是结束了
public static class node{
int data;
node next;
}
public static class link{
node head;
int length;
void link( node head,int length) {
this.head = head;
this.length = length;
head.next = null;
}
void input(int temp[]) { //输入转换部分
int x=0;
//输入一串带空格的数据并转为整数存入数组中
String s;
System.out.println("请输入您将存放的数据:");
System.out.println();
Scanner inchar = new Scanner(System.in);
s = inchar.nextLine();
String[] arr;
arr = s.split(" ");
//将n个数据输入数组中
while(length != x)//遍历所有的字符串并转换成整数
{
if( x<arr.length) {
temp[x]=Integer.parseInt(arr[x]);
}
else temp[x]=0;
x++;
}
}
void creatlink(link L) { //尾插法新建
node p = new node();
p = L.head;
int temp[] = new int[length];
input(temp);
System.out.println("您正在用尾插法新建链表");
//尾插法新建链表
for(int i=0;i<length;i++) {
node q = new node();
q.data = temp[i];
p.next = q;
p = q;
}
p.next = null;
}
void creatlink2(link L) { //头插法新建
node p = new node();
p = L.head;
int temp[] = new int[length];
input(temp);
System.out.println("您正在用头插法新建链表");
System.out.println("注意该方法新建的链表存储数据为倒序存放");
//尾插法新建链表
for(int i=0;i<length;i++) {
node q = new node();
q.data = temp[i];
q.next = p.next;
p.next = q;
}
}
void show(link L) { //显示链表
node p = new node();
p = L.head;
int i = 1;
while(p.next != null) {
System.out.println("第"+i+"个元素是:"+p.next.data);
p = p.next;
i++;
}
}
void insert(link L) { //尾部插入元素
node p = new node();
p = L.head;
System.out.println("你将插入一个数:");
System.out.println();
int n = 0;
Scanner insert = new Scanner(System.in);
n = insert.nextInt();
while(p.next != null)
p = p.next;
node q = new node();
q.data = n;
p.next = q;
q.next = null;
length++;
}
void insertfor(link L,int a) {
node p = new node();
p = L.head;
System.out.println("你将插入一个数:");
System.out.println();
int n = 0;
Scanner insert = new Scanner(System.in);
n = insert.nextInt();
int s = 1;
while(s++ != a && a>0) {
p = p.next;
}
node q = new node();
q.data = n;
q.next = p.next;
p.next = q;
length++;
}
int find(link L,int n) { //只能查找一个数
node p = new node();
p = L.head;
int m = 1;
while(p.next != null && p.next.data != n) {
p = p.next;
m++;
}
if (m<=length) return m;
else return -1;
}
int delete(link L) {
node p = new node();
p = L.head;
System.out.println("请输入您要删除的数据:");
System.out.println();
int n = 0;
Scanner insert = new Scanner(System.in);
n = insert.nextInt();
int m = 1;
int x = find(L,n);
if(x != -1) {
while(m!=x) {
p=p.next;
m++;
}
p.next=p.next.next;
return 1;
}
else {
System.out.println("无此数据,删除失败");
return -1;
}
}
}
static int work() {
System.out.println("**************************");
System.out.println("*******请选择如下操作*******");
System.out.println(" 1.头插新建 2.尾插新建 ");
System.out.println(" 3.尾部插入 4.删除数据 ");
System.out.println(" 5.查找数据 6.显示数据 ");
System.out.println(" 7.指定插入 8.退出操作 ");
System.out.println("**************************");
System.out.println();
System.out.println("*******请输入您的选择*******");
int chose = 0;
Scanner num= new Scanner(System.in);
chose = num.nextInt();
String choose[]= {"","头插新建","尾插新建","尾部插入","删除数据",
"查找数据","显示数据","指定插入","退出操作"};
if (chose>0 && chose<=8) {
System.out.println("您选择的操作是: "+choose[chose]);
System.out.println();
}
else {
System.out.println("您的选择有误,请重新输入:");
System.out.println();
work();
}
return chose;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//函数的声明与使用:
//注意这下面要先实例化对象,这和C++不同,要先new才证明存在这个对象
//否则函数无法声明与调用
node head = new node();
link mylink = new link();
int a=work();
while(a != 8) {
switch(a) {
case 1:{
System.out.println("你将新建一个链表,长度为:");
System.out.println();
Scanner maxnum = new Scanner(System.in);
int max = maxnum.nextInt();
mylink.link(head,max); //初始化
mylink.creatlink2(mylink);
System.out.println("您已经成功新建一个长度为"+mylink.length+"的链表");
System.out.println("请选择继续操作");
a=work();
}
break;
case 2:{
System.out.println("你将新建一个链表,长度为:");
System.out.println();
Scanner maxnum = new Scanner(System.in);
int max = maxnum.nextInt();
mylink.link(head,max); //初始化
mylink.creatlink(mylink);
System.out.println("您已经成功新建一个长度为"+mylink.length+"的链表");
System.out.println("请选择继续操作");
a=work();
}
break;
case 3:{
mylink.insert(mylink);
System.out.println("请选择继续操作");
a=work();
}
break;
case 4:{
int b = mylink.delete(mylink);
if(b != -1) {
System.out.println("请选择继续操作");
a=work();
}
else {
System.out.println("请选择继续操作");
a=work();
}
}
break;
case 5:{
System.out.println("请输入您要查找的数据:");
System.out.println();
int n = 0;
Scanner insert = new Scanner(System.in);
n = insert.nextInt();
int x = mylink.find(mylink, n);
if(x != -1) {
System.out.println("您要查找的数据:"+n+"在"+x+"处");
System.out.println("请选择继续操作");
a=work();
}
else {
System.out.println("您要查找的数据:"+n+"并不存在");
System.out.println("请选择继续操作");
a=work();
}
}
break;
case 6:{
mylink.show(mylink);
System.out.println("请选择继续操作");
a=work();
}
break;
case 7:{
System.out.println("目前链表的长度为"+mylink.length);
System.out.println("请输入您要插入的位置:");
System.out.println();
Scanner maxnum = new Scanner(System.in);
int max = maxnum.nextInt();
mylink.insertfor(mylink, max);
System.out.println("请选择继续操作");
a=work();
}
break;
case 8:
break;
}
}
}
}