注意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;
}
}
}
}