JAVA基础---(链表)

链表的结构:链表没有长度的限制—>动态的(对象)数组

以下实现链表的增删改查以及遍历输出:

package 链表;
//链表没有长度的限制,--->动态的(对象)数组
class Link{
    private class Node{
        private String data;//存放当前节点的数据
        private Node next;//存放下一个节点的地址
        public Node(String data)
        {
            this.data=data;
        }
        /*增加节点*/
        public void addNode(Node newNode)
        {
            if(this.next==null)//当前节点对象的next为空
            {
                this.next=newNode;//把新节点的地址赋给当前节点的next
            }
            else//当前节点next不为空,即当前节点后还有节点
            {
                this.next.addNode(newNode);
                //递归,直到找到某一个节点的next为空,再把新节点地址赋给这个节点的next
            }
        }
        /*判断节点是否存在*/
        //第一次调用:Link类的link.root对象
        //第二次及以后调用:Node类的link.root.next对象
        public boolean containsNode(String data)
        {
            if(data.equals(this.data))//当前节点满足要求
            {
                return true;
            }
            else//当前节点不满足要求,向后查询,需要判断后面是否存在节点
            {
                if(this.next!=null)//存在后续节点
                {
                    //递归调用,直到找到满足要求的节点
                    return this.next.containsNode(data);
                }
                else//不存在后续节点
                {
                    return false;
                }
            }

        }
        /*查询在指定节点的数据*/
        public String getNode(int index)
        {
            //一边查询一边给节点编号,索引动态生成
            if( foot++ == index)
            {
                return this.data;
            }
            else
            {
                return this.next.getNode(index);
            }
        }
        /*修改节点的数据*/
        public void setNode(int index,String data)
        {
                if(Link.this.foot++==index)
                {
                   this.data=data;
                }
                else
                {
                     this.next.setNode(index,data);
                }
        }
        /*删除非根节点,previous当前节点的前一个节点*/
        public void removeNode(Node previous,String data)
        {
            if(data.equals(this.data))//当前节点是要删除的
            {
                previous.next = this.next;
                //将当前节点的下一个节点的地址赋给当前节点的前一个节点的next
            }
            else//如果当前节点不是要删除的
            {
                //递归,直到找到
                removeNode(this,data);
            }
        }
        /*节点数据存入数组*/
        public void toArrayNode()
        {
            Link.this.retArray[Link.this.foot++]=this.data;
            if(this.next!=null)
            {
                this.next.toArrayNode();
            }
        }
    }
    private Node root;//根节点
    private int count;//记录节点的个数
    private int foot;//记录每个节点的编号
    private String []retArray;//对象数组接收节点数据,便于输出
    /*添加数据*/
    public void add(String data)
    {
        if(data==null)
        {
            return ;
        }
        Node newNode = new Node(data);
        if(this.root==null)//没有根节点,将新节点作为根节点
        {
            this.root=newNode;
        }
        else//根节点存在,将新节点交给Node类处理
        {
           this.root.addNode(newNode);
        }
        this.count++;//统计节点的个数
    }
    /*链表长度--->节点的个数*/
    public int Size()
    {
        return this.count;
    }
    /*判断空链表*/
    public boolean isEmpty()
    {
        return this.count==0;
    }
    /*判断数据是否存在链表---->遍历链表并比较值是否相等*/
    public boolean contains(String data)
    {
        if(data==null||this.root==null)
        {
            return false;
        }
        else//链表存在并且有数据
        {
            //将数据交给Node类处理
            return this.root.containsNode(data);
        }
    }
       /*根据链表的索引查询节点数据*/
       public String get(int index)
       {
           if(index > this.count)//索引超过节点的个数
           {
               return null;
           }
               this.foot=0;//从前往后查找
               return this.root.getNode(index);
       }
       /*修改指定索引的数据*/
       public void  set(int index,String data)
       {
           if(index>this.count)
           {
               return ;
           }
           this.foot=0;
           this.root.setNode(index,data);
       }
       /*链表的删除*/
       public void remove(String data) {
           if (this.contains(data))//判断数据存在链表,才能删除
           {
               //删除根节点
               if (data.equals(this.root.data))
               {
                   this.root = this.root.next;
               } else//删除非根节点
               {
                   this.root.next.removeNode(this.root, data);
               }
               this.count--;//节点的个数减一
           }
           else
           {
               System.out.println("该数据不存在无法删除!!!");
           }
       }
       /*链表数据转化对象数组*/
       public String []toArray()
       {
           if(this.root==null)
           {
               return null;
           }
           this.foot=0;
           this.retArray=new String[this.count];
           this.root.toArrayNode();
           return this.retArray;
       }
}
public class LinkDemo {
    public static void main(String[] args) {
        /*创建链表*/
        Link link = new Link();
        /*向链表中添加数据*/
        link.add("aaa");
        link.add("bbb");
        link.add("ddd");
        /*取得链表的长度*/
        System.out.println("链表的长度为: "+link.Size());
        /*判断某个数据是否存在链表*/
        System.out.println(link.contains("bbb"));
        System.out.println(link.contains("bb"));
        /*通过链表的索引查找链表的内容*/
        System.out.println(link.get(1));
        /*修改某个节点的数据*/
        link.set(1,"ccc");
        System.out.println(link.get(1));
        /*删除某个节点*/
        link.remove("ccc");
        System.out.println(link.get(1));
        /*遍历链表输出*/
        String[] linkArray = link.toArray();
        for (int i = 0; i < linkArray.length; i++) {
            System.out.println(linkArray[i]);
        }
    }
}


链表的基本结构:
在这里插入图片描述
删除根节点:
在这里插入图片描述
删除非根节点:
在这里插入图片描述
链表内容的输出:类中不建议出现输出语句,转化为对象数组输出
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值