LinkedList 链表结构 手写源码 实现部分功能

今天疫情有所好转 十五的月亮 十六圆 晚上记得看月亮啊

自己的粗略见解 有问题可以随时指出 多多进步

LinkedList 底层为链表结构
首先先要明白何为链表结构 如图下

在这里插入图片描述

基本是上图这个意思 每个节点代码可以:

public class Node { //

     private Node previous; //上一个节点
     private  Node next;  //下一个节点
     private Object element; //元素数据

    public Node(Object element) { //有参构造
        this.element = element;
    }

    public Node getPrevious() {
        return previous;
    }

    public void setPrevious(Node previous) {
        this.previous = previous;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public Object getElement() {
        return element;
    }

    public void setElement(Object element) {
        this.element = element;
    }
}

这是手写的部分源码 可以参考下自己写写

比较简答的功能

public class MyLinkedList {
     private Node first; //第一个元素
     private Node end; //最后一个元素
     private int  size;  //长度

     //新增方法
     public void add(Object obj){
         Node node = new Node(obj);
         if(first == null){
             //node.setPrevious(null); //上一个元素为null
              //node.setNext(null);  //下一个元素也为null

             first =node;
             end =node;
         }else{
             node.setPrevious(end); //节店的上一个元素赋值
             node.setNext(null);  //节店的下一个元素赋值
             end.setNext(node); //这时候的end  是倒数第二个值
             end = node; //将最后一个节点赋值给end

         }
         size++;
     }

     //在指定位置新增元素
     public void add(int index,Object obj){
         Node node = getNode(index);
         Node newNode =  new Node(obj);
         if(node != null){
             Node up = node.getPrevious();
             if(up !=null){
                 up.setNext(newNode);
             }
             node.setPrevious(newNode);
             newNode.setNext(node);
             if(index ==0){ //如果改变第一个值
                 first.setPrevious(newNode);
                 newNode.setNext(first);
                 first =newNode;
             }

             if(index == size-1){//如果改变的是最后一个的值
                 end = newNode;
             }
             size++;
         }
     }
     //get 方法
     public Object get(int index){
         Node temp = null;

         return  temp.getElement();
     }


     //根据id 获取节点
     public Node getNode(int index){
         Node temp = null;
         if(index<0 || index>size-1){
             throw new RuntimeException("下标越界"+index);
         }
         if(index<size>>1){//加快查询效率
             temp =first;
             for (int i = 0; i <index; i++) {
                 temp = temp.getNext();
             }

         }else{
             temp =end;
             for (int i = size-1; i>index; i--) {
                 temp = temp.getPrevious();
             }

         }
         return  temp;
     }

     //移除方法
     public void remove(int index){
         Node node = getNode(index);
         if(node != null) {

             Node up = node.getPrevious(); //上一个元素
             Node down = node.getNext(); //下一个元素

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

             if (index == 0) { //如果是第一个元素
                 first = down;
             }
             if (index == size - 1) { //如果是最后一个元素
                 end = up;
             }

         }
     }



     //重写toString 方法
    @Override
    public String toString() {
       Node temp = first;
       StringBuilder strb = new StringBuilder("[");
       while (temp!=null){
           strb.append(temp.getElement()+",");
     //      System.out.println(temp.getElement());
           temp =temp.getNext(); //把下一个节点赋值给temp
       }
       strb.setCharAt(strb.length()-1,']');
       return strb.toString();
    }
}```


发布了89 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43726822/article/details/104235156