首页 > 其他分享 >链表结构

链表结构

时间:2022-10-11 11:34:38浏览次数:61  
标签:Node next 链表 instance null 节点 结构

链表

一、链表的分类

1.1 单项链表

每个node节点指向下一个节点。然后有个head节点指向第一个节点,尾节点指向null。也可以有个last节点指向最后一个节点。这样能快速获取最后一个节点,再增加节点的时候能提升效率。

 

 

 

1.2 双向链表

每个节点都有一个pre变量存储上一个节点的地址,一个next变量存储下下一个节点的地址。最后一个节点的next存储null

 

 

 

1.3 循环链表

循环双向链表:与双向链表不同的是最后一个节点的next存储第一个节点的地址。第一个节点的pre存储最后一个节点地址。

 

 

循环单项链表也差不多。

二、代码简易实现

import java.util.*;


public class THS {
    public static void main(String[] args) {
        List<Integer> list = new List<>();
        list.linkLast(1);
        list.linkLast(2);
        list.linkLast(3);
        list.linkFirst(4);
        list.linkFirst(5);
        list.linkFirst(6);
        list.remove(5);
        list.printLink();
    }
}

//节点
class Node<E> {
    //存储当前节点的值
    E item;
    //存储下一个节点的地址
    Node<E> next;
    //存储上一个节点的地址
    Node<E> prev;

    public Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }

}

class List<E>{
    Node<E> first;
    Node<E> last;

    //头插节点
    void linkFirst(E e){
        Node<E> f = first;
        Node<E> temp = new Node<>(null,e,f);
        first = temp;
        if(f == null){
            last = temp;
        }else{
            f.prev = temp;
        }

    }
    //尾插节点
    void linkLast(E e){
        Node<E> l = last;
        Node<E> temp = new Node<>(l,e,null);
        last = temp;
        if (l == null){
            first = temp;
        }else{
            l.next = temp;
        }

    }
    boolean remove(Object o) {
        if (o == null) {
            for (Node<E> x = first; x != null; x = x.next) {
                if (x.item == null) {
                    unLink(x);
                    return true;
                }
            }
        } else {
            for (Node<E> x = first; x != null; x = x.next) {
                if (o.equals(x.item)) {
                    unLink(x);
                    return true;
                }
            }
        }
        return false;
    }

    //移除节点
    void  unLink(Node<E> e){
        Node<E> preNode = e.prev;
        Node<E> nextNode = e.next;

        if (preNode == null){
            first = nextNode;
        }else {
            preNode.next = nextNode;
            e.prev = null;
        }
        if(nextNode == null){
            last = preNode;
        }else{
            nextNode.prev = preNode;
            e.next = null;
        }
        e.item = null;
    }

    void printLink(){
        if(first == null){
            System.out.println("空链表!!!");
        }else{
            Node<E> temp = first;
            while (temp!=null){
                System.out.println(temp.item);
                temp = temp.next;
            }
        }

    }

}














/**单例模式*/

//懒汉
class Singleton1{
    private static Singleton1 instance = null;
    private Singleton1(){}
    public static Singleton1 getInstance(){
        if (instance != null){
            instance = new Singleton1();
        }
        return instance;
    }
}
//饿汉
class Singleton2{
    private static final Singleton2 instance = new Singleton2();
    private Singleton2(){}
    public static Singleton2 getInstance(){
        return instance;
    }
}
//枚举
class Singleton3{
    private Singleton3(){}
    private enum Singleton{
        INSTANCE;
        private final Singleton3 instance;
        private Singleton(){
            instance = new Singleton3();
        }
        private Singleton3 getInstance(){
            return instance;
        }
    }
    public Singleton3 getInstance(){
        return Singleton.INSTANCE.getInstance();
    }
}
//双重校验锁
class Singleton4{
    private static volatile Singleton4 instance;
    private Singleton4(){}
    public static Singleton4 getInstance(){
        if(instance == null){
            synchronized (instance){
                if (instance == null){
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
}

 

三、扩展

1、jdk1.8中LinkedList使用的是双向链表。

2、插入和删除的时间复杂度为o(1),查询为o(n)所以一般再插入删除多的情况下用链表。

标签:Node,next,链表,instance,null,节点,结构
From: https://www.cnblogs.com/thh19201420/p/16778643.html

相关文章

  • Vue export default {} 函数基本结构
    <script>importConfirmfrom'../sub/Confirm';exportdefault{name:"First",//components组件注册components:{Con......
  • 搜索中常见数据结构与算法探究(一)
    1前言ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题:第一篇主要介绍数据结构和算法基础和分......
  • switch分支结构
    1、Switch关键字,表示Switch分支2、表达式对应一个值3、case常量1:当表达式的值等于常量1,就执行语句块14、break:表示退出Switch5、如果和case常量1匹配,就执行语句块1,如......
  • Markdown语法结构
    标题一级标题:#+空格+标题名字二级标题:##+空格+标题名字以此类推,最多六级标题字体加粗:**+内容**斜体:*+内容*加粗斜体:***+内容***(去掉空格)删除线:~~内容~......
  • leetcode-287. 寻找重复数-数组构成的链表
    287.寻找重复数由题中数字都在[1,n]范围内(包括1和n),可知至少存在一个重复的整数。维护一个映射关系f(n)=index->num,其中数组的下标index,数字为num当一......
  • mysql树型结构查询父类函数,mysql递归查询父类函数
     ================================©Copyright蕃薯耀 2022-10-10https://www.cnblogs.com/fanshuyao/ 一、MySQL中创建函数时出现错误的解决方法此步可跳过不......
  • 第五组 chao3 多分支结构学习总结
    一,学习内容梳理1.多分支结构和else-if语句else--if是最常用的实现多分支(多路选择)的方法,其一般形式为:if(表达式1) 语句1;else if(表达式2) 语句2;...12elseif(表达......
  • 构造树型结构数据
    /***构造树型结构数据*@param{*}data数据源*@param{*}idid字段默认'id'*@param{*}parentId父节点字段默认'parentId'*@param{*}children......
  • 尚硅谷-JavaWeb Day6 JavaEE三层架构及web分层结构
    JavaEE三层架构介绍分层的目的是为了解耦,解耦就是为了降低代码耦合度,方便项目后期的维护和升级; web层:com.xxx.web/servlet/controllerservice层:com.xxx.serv......
  • 冯诺依曼结构和哈佛结构区别
    冯诺依曼结构和哈佛结构区别为:存储器结构不同、总线不同、执行效率不同。一、存储器结构不同1、冯诺依曼结构:冯诺依曼结构是一种将程序指令存储器和数据存储器合并在一起......