总结—链表与数组

数组连续存储

链表分散

 

 

1.链表分类

2.链表的组成

     头节点-(引用)->中间节点-(引用)->尾节点

     

     

     节点有两个部分组成:

     1.数据域

                     存储数据

     2.引用域

                    下一个节点的引用

3.链表的简单实现

   node  节点

   linkedlist  链表

   

4.数组的优点和缺点

          定义一个数组的方式:

          数据类型 [] 数组名 = new 数据类型[长度];  //[]表示数组

          数据类型 [] 数组名  ={值,...};

          数据类型 [] 数组名   ;

          数组名  = new  数据类型[长度] ;

          数组名  = new  数据类型[] {值,....};        

             

         数据类型 [] [] 数组名 = new 数据类型[行] [列];  

         数据类型 [] 数组名  ={{值,.},{..}};   

         

         空指针异常    

         

     int [] array = new int [10];//可以赋值的是数字 不是对象

     

     

     获取一维数组元素总数:数组名.length;

     获取二维数组的行的列数:数组名[r].length;

      获取二维数组的行数:数组名.length;

      

      

      获取指定位置的数据:数组名[下标];

                                             数组名[行下标][列下标];

     

     缺点:

     大小确定,不能根据数据总数的变化进行更改大小

       

 

 

设置节点    

/*

 * 节点类

 */

 

public class Node {  

 

    private Object data;//数据  

    private Node   next;//引用域  

      

    public Object getdata()  

    {  

        return data;  

          

    }  

    public void setdata(Object data)  

    {  

          this.data=data;  

          

    }  

    public Node getNext()  

    {  

        return next;  

    }  

    public void setNext(Node next)  

    {  

        this.next=next;  

    }  

      

}  

 

设置链表,功能为增加,删除,查找,修改

 

——参考了其他代码和注释

 

public class LinkedList {  

 

    private Node root;// 声明一个根节点  

    private Node tail;// 声明一个尾节点  

    private int size;// 声明记录链表中节点的个数  

 

    /** 

     * 添加节点的方法 

     *  

     *  newnode要被添加的节点对象 

     */  

    public void add(Node newnode) {  

        // 判断root是否为null,如果是,则表示此时第一次添加节点  

        if (root ==null) {  

            root = newnode;// 将新节点给根节点  

            tail = newnode;// 将新节点给尾节点  

        }   

        else {// 将新节点添加到尾节点之后。  

            tail.setNext(newnode);// 将新节点设置为尾节点的下一个节点  

            tail = newnode;// 将尾节点移动到新添加的节点上,此处表示是末尾节点。  

        }  

        size++;// 让计数器加1  

    }  

 

    /** 

     * 移除指定索引位置的数据 

     * 在指定位置处删除节点 

     * 返回移除的数据 

     */  

    public Object removeindex(int index) {  

        Node node = root;//遍历的节点,从根节点开始遍历  

        Node removeNode;//要移除的节点  

        if (index == 0) {//如果要移除的是第一个节点  

            root = node.getNext();//将root的下一个节点设置为root  

              

            removeNode = node;//把原来的root赋给要移除的节点  

        } else {//如果要移除的是不是第一个节点  

                //找到要移除节点的前一个节点对象  

            for (int i = 0; i < index - 1; i++) {  

                node = node.getNext();  

            }  

            //判断要移除的节点是否是最后一个  

            if (index == size - 1) {  

                //将node的下一个节点赋给要移除的节点  

                removeNode = node.getNext();  

                //将node的下一个节点引用设置为null  

                node.setNext(null);  

            } else {//要移除的节点是在链表的中间  

                //将node的下一个节点赋给要移除的节点  

                removeNode = node.getNext();  

                //将removeNode下一个节点的引用赋给nextNode  

                Node nextNode = removeNode.getNext();  

                //将removeNode的下一个节点nextNode赋给node,保持链表不会中断  

                node.setNext(nextNode);  

            }  

        }  

        size--;  

        //返回要移除节点的数据域对象  

        return removeNode.getdata();  

    }  

 

    /** 

     * 获取指定索引位置节点的数据 

     *  

     * @param index指定的索引位置 

     */  

    public Object getData(int index) {  

        if (index < 0 || index >= size)//如果索引位置超出范围  

            return null;  

        Node node = root;//定义用来遍历的节点  

        // 循环获取到指定索引位置的节点  

        for (int i = 0; i < index; i++) {  

            node = node.getNext();  

        }  

        // 返回指定索引位置的元素  

        return node.getdata();  

    }  

      

      

    /** 

     * 修改索引节点的数据 

     * @return  

     */  

    public Object changedata(int index ,Object data)  

    {  

        if(index<0||index>=size)  

            return null;//如果索引位置超出范围,返回空  

        Node node=root;  

        for(int i=0;i<index;i++){  

            node=node.getNext();  

        }  

         node.setdata(data);//改变指定节点的数据  

         return node.getdata();//返回索引位置的数据  

    }  

 

      

      

    /** 

     * 移除指定的数据,根据对象的属性值来移除数据 

     *  removedata为指定要移除的数据 

     *  返回移除的次数 

     */  

    public int removeData(Object  removedata){  

        Node node = root;//定义用来遍历的节点  

        int count=0;  

        int index;  

        Node removeNode;  

          

       //如果要移除的是头节点  

        if(root.getdata().equals(removedata))  

            {root=root.getNext();  

             count=1;  

            }  

        // 循环获取到指定索引位置的节点  

        for (int i = 0; i < size-2; i++) {  

              

            if(node.getNext().getdata().equals(removedata))//如果node的下一节点的数据就是要找的数据,现在node就是要移除数据的前一个指针  

            {  

                 index=i+1;  

                 count++;  

                 removeNode = node.getNext();//removeNode就是要移除数据的节点  

                //获取要删除节点的下一个节点,定义为nextNode  

                 Node nextNode = removeNode.getNext();  

                //将removeNode的下一个节点nextNode赋给node,这样要移除节点的前一个节点就跳过removeNode直接指向nextNode了  

                 node.setNext(nextNode);  

            }  

            node = node.getNext();//获取下一节点  

              

        }  

        size=size-count;  

        return count;//返回移除指定数据的次数  

          

          

    }  

      

      

    /** 

     * 返回链表中节点总数 

     *  

     * @return 返回size属性 

     */  

    public int size() {  

        return size;  

    }  

      

    /** 

     *在指定位置插入节点 

     *index为指定索引位置 

     */  

    public void insert(int index,Object s)  

    {  

        if(index<0||index>size)  

            System.out.println("错误");  

        Node temp=root;//定义要遍历的节点,从根节点开始遍历  

        Node insertNode=new Node();//定义要添加的节点  

        insertNode.setdata(s);  

          

          

        for(int i=0;i<index-1;i++)//得到要原链表添加位置的前一个节点  

        {  

            temp=temp.getNext();  

        }  

           

          insertNode.setNext(temp.getNext());  

          temp.setNext(insertNode);//设置这个节点指向要插入的节点

        size++;  

    }  

      

 

}

————11.16

没有实现哈夫曼二叉树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值