天天看点

手工实现LinkedList ---add、get、remove、插入方法

1.add方法 

public class Node {
    Node previous;//上一个节点
    Node next;//下一个节点
    Object elements;//元素数据

    public Node(Node previous, Node last, Object elements) {
        this.previous = previous;
        this.next = next;
        this.elements = elements;
    }

    public Node(Object elements) {
        this.elements = elements;
    }
}
           
public class SxtLinkedList01 {
    private Node first;//第一个节点
    private Node last;//最后一个节点
    private int size;//节点数


    //[]
    //["a","b","c"]
    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;
        }
    }

    //重写 toString 方法
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        Node temp =first;
        while(temp!=null){
            sb.append(temp.elements+",");
            temp=temp.next;
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }



    public static void main(String[] args) {
        SxtLinkedList01 list= new SxtLinkedList01();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
    }

}
           
 [a,b,c]

2.get方法

public class SxtLinkedList01 {
    private Node first;//第一个节点
    private Node last;//最后一个节点
    private int size;//节点数

    public Object get(int index){
        if(index<0||index>size-1){

            throw new RuntimeException("索引数字不合法:"+index);
        }
        Node temp=null;
        if(index<=(size>>1)){//如果get的索引值小于size的一半,从前往后遍历到一半
            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.elements;
    }






    //[]
    //["a","b","c"]
    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++;//每增加一个元素,size要加一
    }

    //重写 toString 方法
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        Node temp =first;
        while(temp!=null){
            sb.append(temp.elements+",");
            temp=temp.next;
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }



    public static void main(String[] args) {
        SxtLinkedList01 list= new SxtLinkedList01();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list);
        System.out.println(list.get(2));

    }

}
           

3.remove方法

public class SxtLinkedList01 {
    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;
            Node down=temp.next;
            //前一个元素不为空时:
            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);
        return temp!=null?temp.elements: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;

}





    //[]
    //["a","b","c"]
    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++;
    }

    //重写 toString 方法
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        Node temp =first;
        while(temp!=null){
            sb.append(temp.elements+",");
            temp=temp.next;
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }



    public static void main(String[] args) {
        SxtLinkedList01 list= new SxtLinkedList01();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("e");
        list.add("f");
        list.add("g");
        System.out.println(list);

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

    }

}
           

4. add插入元素

public class SxtLinkedList01 {
    private Node first;//第一个节点
    private Node last;//最后一个节点
    private int size;//节点数

    public void add(int index,Object obj){
        Node newNode=new Node(obj);
        Node temp=getNode(index);
        //插入元素不为空
        if(temp!=null){
            Node up=temp.previous;
            Node down=temp.next;

            //指定索引位置前一个不为空时,即索引值不为0
            if(up!=null){
                up.next= newNode;
                newNode.previous=up;

                newNode.next=temp;
                temp.previous=newNode;
            }else{//当索引值为0时
                down.previous=newNode;
                newNode.next=down;

                newNode.previous=temp;
                temp.next=newNode;

            }

            }

    }

    public void remove(int index){
        Node temp =getNode(index);
        //移除元素不为空时
        if(temp!=null){
            Node up=temp.previous;
            Node down=temp.next;
            //前一个元素不为空时:
            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);
        return temp!=null?temp.elements: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;

}





    //[]
    //["a","b","c"]
    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++;
    }

    //重写 toString 方法
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        Node temp =first;
        while(temp!=null){
            sb.append(temp.elements+",");
            temp=temp.next;
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }



    public static void main(String[] args) {
        SxtLinkedList01 list= new SxtLinkedList01();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("e");
        list.add("f");
        list.add("g");
        System.out.println(list);

        list.add(0,"小王");//[a,b,c,e,f,g]
        System.out.println(list);//[a,小王,b,c,e,f,g]
    }

}
           

5.增加泛型

public class SxtLinkedList01<E> {
    private Node first;//第一个节点
    private Node last;//最后一个节点
    private int size;//节点数

    public void add(int index,E element){
        checkRange(index);
        Node newNode=new Node(element);
        Node temp=getNode(index);
        //插入元素不为空
        if(temp!=null){
            Node up=temp.previous;
            Node down=temp.next;

            //指定索引位置前一个不为空时,即索引值不为0
            if(up!=null){
                up.next= newNode;
                newNode.previous=up;

                newNode.next=temp;
                temp.previous=newNode;
            }else{//当索引值为0时
                down.previous=newNode;
                newNode.next=down;

                newNode.previous=temp;
                temp.next=newNode;

            }

            }

    }

    public void remove(int index){
        checkRange(index);
        Node temp =getNode(index);
        //移除元素不为空时
        if(temp!=null){
            Node up=temp.previous;
            Node down=temp.next;
            //前一个元素不为空时:
            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 E get(int index){
        checkRange(index);
        Node temp =getNode(index);
        return temp!=null?(E)temp.elements:null;
    }
    private void checkRange(int index){
        if(index<0||index>size-1){
            throw new RuntimeException("索引数字不合法:"+index);
        }
    }

private Node getNode(int  index){
    checkRange(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;

}





    //[]
    //["a","b","c"]
    public void add(E element){
        Node node=new Node(element);
        if(first==null){
            first=node;
            last=node;
        }else{
            node.previous=last;
            node.next=null;

            last.next=node;
            last=node;
        }
        size++;
    }

    //重写 toString 方法
    public String toString() {
        StringBuilder sb=new StringBuilder("[");
        Node temp =first;
        while(temp!=null){
            sb.append(temp.elements+",");
            temp=temp.next;
        }
        sb.setCharAt(sb.length()-1,']');
        return sb.toString();
    }



    public static void main(String[] args) {
        SxtLinkedList01<String> list= new SxtLinkedList01();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("e");
        list.add("f");
        list.add("g");
        System.out.println(list);

        list.add(0,"小王");//[a,b,c,e,f,g]
        System.out.println(list);//[a,小王,b,c,e,f,g]
        System.out.println(list.get(2));
    }

}