最近突然对数据结构的实现感兴趣,闲来无事用Java手写的一个链表系统
推荐自己从头到尾写一遍,还是有些趣味性的,还可以加深对于链表运行过程的理解
import java.util.*;
import java.util.Arrays;
public class Node {
int x;
Node next;
Node(){
x = 0;
}
Node(int x){
this.x = x;
}
}
class Linklist{
Node first;
int cnt=0;
Linklist(){
this.init();
}
void Insert(int x,int i){
if(i<1||i>this.cnt+1){
System.out.println("插入失败,请检查下标");
return;
}
Node q = new Node(x);
Node p = this.first;
for(int j=1;j<i;j++){
p = p.next;
}
q.next = p.next;
p.next = q;
this.cnt++;
}
void print(){
if(this.cnt==0){
System.out.println("Null\n");
return;
}
Node p = this.first.next;
for(int i=0;i<this.cnt;i++){
System.out.print(p.x+" ");
p = p.next;
}
System.out.println();
}
void init(){
this.first = new Node();
this.first.next = null;
}
void changeX(int x,int i){
if(i<1||i>this.cnt){
System.out.println("修改失败,请检查下标是否正确");
return;
}
Node p = this.first;
for(int j = 0;j<i;j++)p=p.next;
p.x = x;
}
void delete(int i){
if(i<1||i>this.cnt){
System.out.println("删除失败,请检查下标是否正确");
return;
}
Node q;
Node p = this.first;
for(int j=1;j<i;j++){
p=p.next;
}
q= p.next;
p.next = q.next;
this.cnt--;
}
void find(int x){
Node p = this.first;
for(int j = 1;j<=this.cnt;j++){
p=p.next;
if(p.x==x){
System.out.printf("链表中 %d 为第 %d个元素\n",x,j);
}
}
System.out.printf("未找到 :%d\n",x);
}
void sort(){
int[] a = new int[this.cnt+10];
Node p = this.first;
for (int i = 0; i<this.cnt; i++){
p = p.next;
a[i] = p.x;
}
Arrays.sort(a,0,this.cnt);
p = this.first;
for (int i = 0; i<this.cnt; i++){
p = p.next;
p.x = a[i];
}
}
}
class test1{
public static void main(String[] args) {
Linklist list = new Linklist();
test1Job(list);
}
static void menu(){
System.out.println("---------------------------");
System.out.println("1. 插 入 元 素");
System.out.println("2. 删 除 元 素");
System.out.println("3. 修 改 元 素");
System.out.println("4. 寻 找 元 素");
System.out.println("5. 链 表 排 序");
System.out.println("6. 输 出 链 表");
System.out.println("7. 退 出 系 统");
System.out.println("---------------------------");
}
static void Insert(Linklist list){
Scanner in = new Scanner(System.in);
System.out.println("输入插入节点数:");
int n= in.nextInt();
System.out.printf("输入 %d 个整数:",n);
for(int i=0;i<n;i++){
list.Insert(in.nextInt(),list.cnt+1);
}
}
static void test1Job(Linklist list){
Scanner in = new Scanner(System.in);
int input= 1;
while(input!=7){
menu();
System.out.println("输入选项[1~7]:");
input = in.nextInt();
if(input<1||input>7)
{
System.out.println("麻烦您输入正确选项,谢了");
continue;
}
switch (input){
case 1:
Insert(list);
break;
case 2:
int x;
System.out.println("输入你要删除的数字下标(下标从1开始)");
do{
x = in.nextInt();
if(x<1||x>list.cnt)
System.out.printf("请输入正确下标,目前链表长度为 %d,你输入的范围是[%d~%d]",list.cnt,1,list.cnt);
}while(x<1||x>list.cnt);
list.delete(x);
break;
case 3:
int y;
System.out.println("输入你要修改的数字下标(下标从1开始)");
do{
y = in.nextInt();
if(y<1||y>list.cnt)
System.out.printf("请输入正确下标,目前链表长度为 %d,你输入的范围是[%d~%d]",list.cnt,1,list.cnt);
}while(y<1||y>list.cnt);
System.out.println("输入你要修改的值");
int ch = in.nextInt();
list.changeX(ch,y);
break;
case 4:
System.out.println("请输入你要寻找的值");
int fi = in.nextInt();
list.find(fi);
break;
case 5:
list.sort();
System.out.println("排序完成啦");
break;
case 6:
System.out.print("链表输出:");
list.print();
break;
case 7:
System.out.println("退出成功啦");
break;
}
}
}
}