Java之链表操作源码及部分思路

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

        }
}

猜你喜欢

转载自blog.csdn.net/jack_zj123/article/details/81591983