• 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!!!
  • 相关阅读:
    微信小程序知识点梳理
    Vue基础知识梳理
    JQuery总结
    JS实现简单斗地主效果
    JS应用猜数游戏
    JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
    JS数组的基本操作方法
    JS,ATM代码
    简单理解Vue中的nextTick
    Vue keep-alive实践总结
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14691081.html
Copyright © 2020-2023  润新知