数据结构(3)-从零开始实现一个java链表

Java|数据结构——Java单链表的实现 欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。问题描述数据结构在计算机科学中是一门综合性的专业基础课,... 阅读详情

数据集合是编程中常用的逻辑,链表是在数据结构中经常被用到和考察,JDK util 包中提供了Queue 接口,
LinkedList、LinkedHashSet、LinkedHashMap<K,V>实现。
显而易见,linkedHashSet 是以LinkedHashMap<K,V> 为基础来实现的。

 /**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @param      dummy             ignored (distinguishes this
     *             constructor from other int, float constructor.)
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

之前在做数据采集的时候,自己动手写了一个采集程序,虽然过程曲折,但对于后期对于开源爬虫的使用很有帮助,当你自己实现了一个算法,简单引擎,再去看同类就有一种俯视的视角, 不要迷信权威 ,毕竟计算机行业发展还处于起步阶段。

什么是链表

接下来 先大概说一下链表,链表顾名思义,是由一个一个节点组成的一个数据链 ,前一个节点next 指向后一个节点,遍历的时候,根据头节点顺序找到尾节点。
链表示意图:
在这里插入图片描述

链表的实现在不同开发语言中细节不同 (),但链表的定义有一个通用的标准,引用《算法导论》中的定义

链表 linked list 是一种这样的数据结构, 其中的各对象an线性顺序排列,数组的线性顺序是由数组的下标决定,然而与数组不同的是,链表的顺序是由各个对象的指针决定的,链表为动态集合提供一种简单而灵活的表示方法。

支持 insert 、delete、pop 常用操作方法

链表节点

链表节点 首先能保存数据,这里简单选择了object 对象

然后节点中需要指向另一个节点

class Node {


    private String name;

    private Object data;

    private Node next;


    public Node(String name, Object data, Node next) {
        this.name = name;
        this.data = data;
        this.next = next;
    }

    public boolean hasNext() {
        if (null == next) {
            return false;
        } else {
            return true;
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

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


}

这里我选择了inner class

链表的简单实现

public class LinkedList {

    /**
     * 头节点
     */
    private Node head;

    /**
     * 判断链表是否为空
     *
     * @return
     */

    private Boolean isEmpty() {
        if (null == head) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * 获取头节点
     *
     * @return
     */
    public Object getHead() {
        if (null == head) {
            return null;
        } else {
            return head.getData();
        }

    }

    /**
     * 增加节点
     */
    public boolean insertData(Object data) {

        if (isEmpty()) {
            head = new Node("first", data, null);
        } else {
            Node temp=head;
            while (temp.hasNext()) {
                temp = temp.getNext();
            }
            temp.setNext(new Node("last", data, null));
        }
        return true;

    }

    /**
     * 删除节点
     */

    public boolean deleteData(Object data) {

        if (isEmpty()) {
            return false;
        } else {
            /**
             * 如果是头节点 直接删除返回
             */
            if (head.getData() == data) {
                head = head.getNext();
                return true;
            } else {
                while (head.hasNext()) {
                    Node temp = head.getNext();
                    if (temp.getData() == data) {
                        head.setNext(temp.getNext());
                        break;
                    }
                }
                return true;
            }
        }


    }
}

链表翻转

链表翻转是一道常见的算法题目,比较简单

下班给出一种简单的解题思路:

链表由于只能指向后续节点,没有下标所以要遍历链表 截断,所有你需要 借用三个新的节点

起名为:
航行节点,用于遍历链表
head 节点 用户找到新的翻转节点
rail 节点 用户找到原来的节点

a->b->c->d

sail
head
tail

sail->a->b->c->d

head->a sial->b-c-d
tail=b
head->b->a sial-c-d

   Node fake = new Node("fake", 0, null);
        Node sail = new Node("sail", 0, d);
        while (sail.hasNext()) {
            Node temp = sail.getNext();
            sail.setNext(sail.getNext().getNext());
            if (fake.hasNext()) {
                temp.setNext(fake.getNext());
                fake.setNext(temp);
            } else {
                fake.setNext(temp);
                temp.setNext(null);
            }
        }

        while (fake.hasNext()) {
            System.out.println(fake.getNext().getData());
            fake = fake.getNext();
        }
电商订单系统设计简析(一) 电商所有模块中,订单系统作为最为核心的模块,决定了整个流程能不能顺畅的执行,起着承上启下的作用。相信很多PM都不陌生,到了一家电商公司,总会觉得公司现有的流程有不少问题,因为问题来自四面八方,一下子摸不着到底是哪里出了问题,PM就跟补丁师傅一样,遇到一个补一个。其实很多日常开发和测试提得需求都是表面需求,而这些表面上呈现出的各种问题,都是源自于流程上的不完整或者流程上某个环节上的缺失导致的。订单系... 阅读详情

相关推荐

InstallShield 打包 自定义安装依赖环境

用InstallShield2020打包.NetFramework4.5程序,程序需要集成Access数据库,必须安装AccessDatabaseEngine引擎,而InstallShield中自带的依赖项不包含该项,所以自定义集成了该依赖项。

zhaoziyu2020的博客 1128

Java从0开始(11)(常见的数据结构)

常见的数据结构 栈(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。 出栈(pop)和入栈(push): 栈(Stack)是一个后进先出(Last in first...

nimwwda的博客 286

四大厂商网络设备巡检命令实战指南:华为、华三、锐捷、思科

本文详细介绍了华为、华三、锐捷、思科四大厂商网络设备的巡检命令实战指南,涵盖硬件状态、软件运行和网络功能等核心维度。通过具体命令示例和实用技巧,帮助网络工程师高效完成设备巡检,预防潜在故障,确保网络稳定运行。

weixin_29235923的博客 390

数据结构之链表(Java实现)

数据结构中线性表的重要知识之一

Easenyang的博客 9317

Quartus II设计程序计数器PC、由PC产生ROM的地址(含仿真)

设计程序计数器PC,正常工作模式下,系统启动,设置PC的初始值,之后每来一个clk,PC的输出值应该增加1;当程序发生跳转时,PC的值应该发生改变,级将跳转的地址值赋进行输出。PC后端连接一个ROM,由PC来产生ROM的地址,仿真进行验证。

m0_73700621的博客 1815

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 671

【数据结构】链表的原理及java实现

一:单向链表基本介绍链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表做一个介绍。单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它

简约人生的博客 11万+

焦距与视差的关系及其对深度估计的影响

焦距在立体视觉中的作用至关重要,它直接影响视差的大小,从而影响深度估计的精度。焦距越长,视差差异越大,物体的深度估计就越精确。这一关系使得焦距长的相机在一些需要高精度深度估计的应用场景中更加优越。了解焦距与视差的关系,对于优化相机配置和提升深度估计精度具有重要意义。在实践中,选择合适的焦距对于获得精确的深度信息至关重要,特别是在自动驾驶、虚拟现实、三维重建等领域,精确的深度估计能够提供更好的用户体验和技术支持。

计算机科学与技术专业学生的成长之路 1671

从零开始手撕一个数据结构(1)——双向链表

前言 刚做完某厂的笔试,要求实现一个LRU算法,没有复习到LRU的我直接就凉了一半了 闲着没事把数据结构都过一遍吧,加深一下印象 作为《从零开始手撕一个数据结构》的第一篇,先从最简单的链表开始吧~ 文章目录前言一、要实现一个什么样的结构?二、实现步骤1. 核心定义1) 创建链表容器类LinkedList2)定义链表核心内部类ListNode2. 方法实现1)添加元素的add方法2)查询元素的get方法3)删除元素的remove方法4)修改元素的set方法5)返回当前链表长度的size方法总结 一、要实

Yuc0114的博客 1425

GD32H757的can通信配置,提供方案参考!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1834

uniapp(安卓苹果app端) - 微信小程序分享提示报错“由于不支持的分享类型无法分享到微信“,“由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信“解决办法,uniapp小程序分享失败

uni-app,安卓app,苹果app,手机app端,苹果ios,安卓Android,移动端app,分享,微信分享,微信朋友圈,微信好友,转发,vue2,vue3,App端调用手机的系统分享,微信小程序,分享功能,原生app分享小程序到微信,可分享到微信、朋友圈等,报错,uniapp分享报错由于不支持的分享类型无法分享到微信,未审核应用,uniApp安卓苹果app报错由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信,微信appid,已经配置了,还是报错,无法解决,一直提示,APP_ID错误,打包

✅ 精选推荐文章 5509

数据结构-3.Java. 链表

由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。说明:1. LinkedList实现了List接口2. LinkedList的底层使用了双向链表3. LinkedList没有实现RandomAccess接口, 因此LinkedList不支持随机访问4. LinkedList的任意位置插入和删除元素时的效率比较高,时间复杂度为O(1)5. LinkedList比较适合任意位置插入的场景。

薯条不要番茄酱的博客 2002

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

【深度学习|地学应用】MODIS AOD产品和HYSPLIT模型的局限性和不确定性?

985小水博的摸鱼日常 461

数据结构之链表(java语言实现)

数据结构之链表(java语言实现)

LNsupermali的博客 4069

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java——数据结构之双向链表

文章目录1.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)删除所有出现的关键字key(8)节点的回收(9)链表打印展示2.完整代码展示完!   接上篇Java——数据结构之单链表   在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是 在之后的 Java学习中,了解 基础 数据结构的知识 非常重要,数据结构的思想 可以帮助我们更加清晰 明白的了解 Java 的解题思路等等。   今天我们就来开始学习 实现一

rain67的博客 2659

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

从零开始手撕一个数据结构(2)——基于链表实现栈和队列

系列文章目录 从零开始手撕一个数据结构(1)——双向链表 文章目录系列文章目录前言栈容器设计一、要设计哪些实例方法?二、实现步骤1. 核心定义1)创建基于双链表的栈容器类LinkedStack2)定义双链表节点内部类Node2. 方法实现1)入栈方法push2)出栈方法pop3)获取栈顶元素方法peek4)检验栈是否为空方法isEmpty()3. 测试队列容器设计一、要设计哪些实例方法?二、实现步骤1. 核心定义1)创建基于单链表的栈容器类LinkedStack2)定义单链表节点内部类Node2. 方法实

Yuc0114的博客 1295

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java——数据结构之单链表

文章目录Java——数据结构之单链表1. 链表的概念及结构2.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)得到单链表的长度(8)单链表打印展示(9)节点的回收3.完整代码的展示完! Java——数据结构之单链表 本次内容介绍大纲   在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是 在之后的 Java学习中,了解 基础 数据结构的知识 非常重要,数据结构的思想 可以帮助我们更加清晰 明白的了解 Ja

rain67的博客 2654

【单链表】数据结构,详解单链表,java实现代码

单链表基本操作,详解单链表

程序员良辰 2659

链表-Java实现链表数据结构

链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上 一个/或下一个节点的位置的链接(“links”) 链表(Linked list):是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数 据,而是在每一个节点里存到下一个节点的指针(Pointer)。 使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针 域,空间开销比较.

♾️ 2737

【数据结构】使用Java实现链表类LinkList

目录链表介绍Java->链表APIJava->链表代码使用链表示例 链表介绍 链表属于线性表的一种 如果想了解Java实现的顺序表,请戳这里:【数据结构】使用Java实现顺序表类 SeqList Java->链表API 在看代码之前,我们先看看链表需要完成什么任务,也就是链表的API,这样有助于理解代码,也有助于快速查找自己想实现的功能。 LinkList(): 构造函数 cl...

qq_41427568的博客 5656

java 链表数据结构实现

java 链表数据结构说明本文适合初学java想要了解数据结构的人,操作正确下面的代码都是可以工作的,如果不能与我联系我会改。java没有指针,虽然没有办法直接访问内存,但是java中有引用,可以引用一块内存空间,所以我们可以用java的指针模型,来实现链表数据结构。我会构建两个类,在两个包中,IntNode类提供基本的操作,IntLinkBag类在IntNode类基础之上,提出了包的概念相当于节点的集合。

TrueSpiderBoy Blog 909

【数据结构 3】双向链表及其Java实现

一、双向链表 1.1 简介 双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。 链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。 1.2 结点API设计 类名 Node 构造方法 Node(T t,Node pre,Node next):创建Node对象 成员变量 1 T item:存储数据

Java技术工坊 479

java基础 之 实现一个链表

自己实现一个链表

oneouto的博客 875

Java 的数据结构:从数组到链表的基础实现

数组和链表各自有其优势和不足,适用于不同的场景。数组的优势在于快速访问和空间效率,但在插入和删除操作方面有所限制。链表则在动态数据处理和插入删除方面有明显的优势,特别适合频繁修改数据的应用场景。了解它们的特性和差异,将帮助你在编程中做出合适的选择。希望这篇文章能帮助你掌握 Java 中这两种重要的数据结构,提升你的编程能力。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1210

Java数据结构之链表及实现

之前学习的顺序表查询非常快,时间复杂度为O(1),但是增删改效率非常低,因为每一次增删改都会元素的移动。可以使用另一种存储方式-链式存储结构。 链表是一种物理存储单元上非连续、非顺序的存储结构。链表由一序列的结点(链表中的每一个元素成为结点)组成。 结点API设计: 类名 Node 构造方法 Node(T t,Node next) 创建Node对象 成员变量 T item:存储数据 Node next :指向下一个结点 结点类: publi

兮遥 2040

Java 自己实现一个单链表

Java实现一个链表

ylqdh的博客 589
上一篇: 精通SpringFamework(2) -读取配置文件过程分析
下一篇: JDK 11 Object中定义的方法
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值