天天看点

LinkedList重写(3)LinkedList 增加remove()方法

package Study.Collection;

/**
 * <p>Description: </p>
 * remove方法实现
 * @author zhangyan
 * @date 2018/12/20 15:53
 */
public class YanLinkedList02 {

    private   Node  first;
    private   Node  last;

    private  int size;


    public   void  remove(int index){
        Node  temp  =  getNode(index);    //获取索引对应的结点

        if(temp!=null){
            Node  up = temp.previous;    //上一个结点命名为up
            Node down = temp.next;       //下一个结点命名为down

            if(up!=null){
                up.next = down;
            }

            if(down!=null){
                down.previous = up;
            }

            if(index==0){               //被删除的元素是第一个元素时
                first = down;
            }

            if(index == size-1){        //被删除的元素是最后一个元素时
                last = up;
            }

            size--;
        }

    }


    public  Object  get(int index) {

        if(index<0||index>size-1){
            throw  new RuntimeException("索引数字不合法:"+index);
        }

        Node temp = getNode(index);

        //temp不等于null就返回对应的值,等于null就返回null
        return temp!=null?temp.element:null;
    }


    //封装结点
    public  Node  getNode(int index){
        Node  temp = null;

        if(index<=(size>>1)){
            temp = first;
            for(int i=0; i<index; i++){
                temp = temp.next;
            }
        }else{
            temp = last;
            for(int i=size-1; i>index; i--){
                temp = temp.previous;
            }
        }

        return temp;
    }




    public  void  add(Object  obj) {
        Node  node  = new Node(obj);

        if(first==null){

            first = node;
            last = node;
        }else{

            node.previous = last;
            node.next = null;

            last.next = node;
            last = node;

        }

        size++;


    }

    public String toString() {
        //[a,b,c]     first=a,    last=c
        //a,b,c
        StringBuilder   sb = new StringBuilder("[");
        Node  temp = first;
        while(temp!=null){
            sb.append(temp.element+",");
            temp = temp.next;
        }
        sb.setCharAt(sb.length()-1, ']');

        return sb.toString();
    }

    //测试
    public static void main(String[] args) {
        YanLinkedList02  list = new YanLinkedList02();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");

        System.out.println(list);

        list.remove(3);
        System.out.println(list);

        list.remove(0);
        System.out.println(list);

        list.remove(5);
        System.out.println(list);

    }
}

           

解析:remove方法实现起来很简单,思路是

1. 获取索引index对应的节点temp;

2. 如果index对应的节点temp不为null,定义好temp上一个节点和下一个节点;

3. 然后连接节点之间,这里要注意的是要判断index是不是对应第一个元素和最后一个元素(如果是第一个元素,temp的下一个节点赋值给YanLinkedList的第一个节点;如果是最后一个元素,temp的上一个节点赋值给YanLinkedList的最后一个节点。)

继续阅读