欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

6.JAVA-链表实例

程序员文章站 2022-04-09 08:59:07
1.实现链表的步骤 1).实现Node节点类(用来保存链表中每个节点的数据,以及下一个节点成员) 2).实现LinkList链表类(用来封装Node节点类,和用户实现交互) 3).在LinkList类里,实现添加,删除,根据要查的Node数据来找表中的序号,根据要查的序号来找对应的Node数据. 4 ......

 1.实现链表的步骤

  • 1).实现node节点类(用来保存链表中每个节点的数据,以及下一个节点成员)
  • 2).实现linklist链表类(用来封装node节点类,和用户实现交互)
  • 3).在linklist类里,实现添加,删除,根据要查的node数据来找表中的序号,根据要查的序号来找对应的node数据.
  • 4).在linklist类里,实现toarrays方法,用来取出链表中的node数据的数组

 

2.类的实现

/*节点类*/ 
class node
{
    private string data;        //节点保存的数据
    private node next;            //下个节点

    public node(string data){
        this.data = data;
    }
    
    public string getdata()
    {
        return data;
    }
    public void setdata(string data)
    {
        this.data = data;
    }
    
    public node getnext()
    {
        return next;
    }
    public void setnext(string data)
    {
        this.next = new node(data);
    }
    
    /*description: 添加节点
     *return     :  
     */ 
    public void addnode(string data)
    {
        if(getnext()!=null)
        {
            this.next.addnode(data);
        }
        else
        {
            this.setnext(data);
        }
    }
    
    /*description: 获取节点数据
     *return     :  
     */ 
    public string getdata(int index)
    {
        string ret =null ;
        if(index == 0)    //如果递归到0,则返回当前数据
        {
            ret=data;
        }
        else            //否则继续递归查找
        {
            ret=this.next.getdata(--index);
        }
        return ret;
    }

    /*description:  递归地查找data位于链表哪个序号
     *return     :  -1(表示未找到)      
     */ 
    public int findindex(string data,int index)
    {
        if(this.data.equals(data))    //已找到
        {
            return index;
        }    
        else if (getnext()==null)    //未找到
        {
            return -1;
        }

        return this.next.findindex(data,++index);

    }

    /*description:  递归地查找data,并删除
     *data: 要找的data
     *prenode:    上个节点,如果为null则当前位于表头
     *index: 表示当前位于链表哪个序号
     *return  :  -1(表示未找到) 0~(len-1) (表示data位于链表哪个序号)         
     */ 
    public int deldata(string data,node prenode,int index)
    {
        int ret = -1;
        
        if(this.data.equals(data))    //删除
        {
            prenode.next = this.next;
            return index;
        }
        else if (getnext()==null)    //未找到
        {
            return ret;
        }

        return this.next.deldata(data,this,++index);
    }

}

/*链表类*/
class linklist
{
    private node next;        //负责管理的节点
    private int len;        //统计节点长度
    
    public linklist(string data)
    {
        next = new node(data);
        len =1;
    }

    /*description:  添加一个节点数据
     *return     :      
     */ 
    public void adddata(string data)
    {
        this.next.addnode(data);
        len++;    
    } 
    

    /*description:  删除一个节点数据
     *return     :  -1(未找到要删除的数据) 0~(len-1) (表示data位于链表哪个序号)         
     */ 
    public int deldata(string data)
    {
        int ret=-1;    
        if(len>=0)                //链表有数据
        {
            if(this.next.getdata().equals(data))    //删除表头需要特殊处理
            {
                this.next = this.next.getnext();
                ret = 0;
            }
            else
              ret = next.deldata(data,this.next,1);    
        }

        if(ret!= -1)    //已删除
        {
            len--;
        }

        return ret;
    } 


    /*description:  根据index找到对应的节点数据
     *return     :  返回节点数据    
     */ 
    public string getnodedata(int index)
    {
        string ret=null;
        if(index>=0 && index<(len))
        {
            ret = next.getdata(index);
        }
        return ret;
    }

    /*description:  根据data查找节点node位于链表哪个序号
     *return     :  -1(表示未找到)  0~(len-1) (表示data位于链表哪个序号)         
     */ 
    public int findnodeindex(string data)        
    {
        int ret=-1;        
        if(len>=0)                //链表有数据
        {
            ret = next.findindex(data,0);  //从序号0开始找
        }
        return ret;
    }        

    /*description:  将链表中所有的节点数据转为数组
     *return     :       
     */ 
    public string[] toarrays()
    {
        node tmp=this.next; 
        
        string[] arr = new string[len];
        

        for(int i=0; i< len; i++)
        {
            arr[i] = tmp.getdata();
            tmp = tmp.getnext();
        }
        return arr;
    }

    public int length()
    {
        return len;
    }
}

 

3.测试代码

public class test{
                public static void main(string args[]){
                linklist list = new linklist("小a");

                //添加节点数据
                list.adddata("小b");
                list.adddata("小c");
                list.adddata("小d");
                list.adddata("小e");

 
                //打印节点数据
                system.out.println("print node data:");
                for(int i=0;i<list.length();i++)
                {
                        system.out.println(list.getnodedata(i));
                }
                system.out.println("---------------------");

                //查找节点数据的序号
                system.out.println("小a的index位于:"+list.findnodeindex("小a"));
                system.out.println("小d的index位于:"+list.findnodeindex("小d"));
                system.out.println("小f的index位于:"+list.findnodeindex("小f"));  //返回-1,表示未找到

                //删除节点数据
                system.out.println("删除小a,并打印小a之前的位置:"+list.deldata("小a"));
                system.out.println("删除小e,并打印小e之前的位置:"+list.deldata("小e"));
                //通过数组打印数据
                system.out.println("\r\nprint node data by toarrays() :");
                string[] arr=list.toarrays();
                for(int i=0;i<arr.length;i++)
                {
                        system.out.println(arr[i]);
                }
                system.out.println("---------------------");
       }       
}

运行打印:

 6.JAVA-链表实例

 

 

ps:这样写,只是简单的实现某个数据类型的链表.在后续章节,会学习如何让链表来自动匹配多态数据类型