4.22JavaLinkedList特点和底层实现

4.22JavaLinkedList特点和底层实现

本章内容

  • LinkedList特点

  • LinkedList底层实现

  • LinkedList实现方法


LinkedList特点

  • 查询效率低

  • 增删效率高

  • 线程不安全

LinkedList底层实现

双向链表实现的存储

特点:

  • 双链表,是链表的一种

  • 每个数据节点中都有两个指针,分别指向前一个节点和后一个节点

优势:

  • 从任意节点开始都可以很方便地找到所有节点

解析:

  • 在使用链表地时候,每一个头部和尾部称为节点

    • 单词表示:Node或者Entry

  • 每一个节点包含三个部分:

    • 第一个节点头部有一个头指针

    • 上一个节点地---指向上一个数据

    • 自己保存的数据

    • 下一个节点---指向下一个数据

  • LinkList地结构让增、删变得很简单

    • 先说删

      • 删掉a2

        • 让a1的尾节点指向a3这个数据本身

        • 让a3的头节点指向a1这个数据本身

        • 这样就实现了删

      • 增加a2

        • 让a1的尾节点指向a2的数据本身

        • 让a3的头节点指向a2的数据本身

如图:

自定义列表还需要定义节点对象:

定义节点对象

每一个节点对象所包含的内容:

class Node{
   Node previous; //前一个节点
   Object element; //本节点保存的数据
   Node next; //后一个节点
}

具体实现:

package com.MyCollection;

/**
* 自定义一个链表---version 1.0
* @author Lucifer
*/
public class LcfLinkedList {

   /*自定义列表定义第一个节点*/
   private Node first; //开始为null
   /*定义最后一个节点*/
   private Node last; //开始为null

   /*定义元素总数量*/
   private int size;

   /*往链表加东西,定义一个add方法*/
   //"[]"--->"["a"]"
   public void add(Object obj){
       /*因为一开始节点为空,没有数据内容,所以往里面加内容---创建一个节点*/
       Node node = new Node(obj);
       /*
       这样就创建好了一个节点
       目前和链表没啥关系
        */

       /*判断是否是第一次往链表里面放元素*/
       if (first == null){
           /*赋值node给first*/
           first = node;
           /*赋值给last*/
           last = node;
           //注意Node类中的元素一开始是否为空
           /*
           下面继续往里面放元素
           "["a","b"]"
           第二次放入的时候first不为空了
           再建一个新对象,放入新节点
            */
      }else {
           /*将上一个节点的尾节点赋值给下一个节点的头节点*/
           node.previous = last;
           /*第二个元素的尾节点为空*/
           node.next = null;
           /*让last的下一个属性指向*/
           last.next = node;
           /*last本身指向node*/
           last = node;
      }
  }

   /*希望输出的结果可视化,重写toString方法*/
   //从first开始打印,然后依次往下找
   //假设有一个链表["a","b","c"]--->first = a, lsat = c--->最终打印要打印出a,b,c
   @Override
   public String toString(){
       /*StringBuilder方法*/
       StringBuilder sb = new StringBuilder("[");
       //TODO Auto-generated method stub
       /*定义一个零时节点*/
       Node temp = first;
       /*在这里做判断---temp不为空,打印一次*/
       while (temp != null){
           /*打印出temp,同时让temp指向尾节点*/
//           System.out.println(temp.element);
           /*再"["后+元素*/
           sb.append(temp.element + ",");
           temp = temp.next;
      }
       sb.setCharAt(sb.length() - 1,']');
       return sb.toString();
  }

   /*测试方法*/
   public static void main(String[] args) {
       /*创建对象,调用方法*/
       LcfLinkedList list = new LcfLinkedList();

       /*使用add方法*/
       list.add("a");
       list.add("b");
       list.add("c");

       System.out.println(list); //因为没有重写toString方法,所以打印出来的内容是包名加数据地址(Hash码)
  }
}

 

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14691081.html