链表LinkedList by Java

之前有写过一些记录(引用),但是忘了乱了,现在重新梳理一遍

链表是Java中List接口的一种实现

定义(引用

链表(linked list)是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的.

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域(data),另一个是存储下一个结点地址的指针域(next),如下图所示:

总结一下

1)链表是以节点的方式来存储,是链式存储

2)每个节点包含 data 域, next 域:指向下一个节点

3)如图:发现链表的各个节点不一定是连续存储.

4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

优势

相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

构建链表

由前面的介绍可知,链表这一数据结构中,最关键的东西就是节点

简单来说:要实现链表,需要先实现(定义)构成链表的节点

不同类型的链表主要也取决于对节点的不同定义

实现链表节点类

单链表的节点结构

Class Node<V>{
V value;
Node next;
}

对应到具体代码实现,每个ListNode对象注意是对象)就代表一个节点

    class ListNode{
public int val;//数据域
//ps:为什么这么写?
//基于链表节点的定义,指针域存放的是下一个节点的地址
//那么下一个节点怎么样才可以产生地址呢?当然是在创建下一个节点对象的时候产生咯
//所以这里需要实例化节点类来创建下一个节点,同时获取到下一个节点的地址,于是便有了下面的写法
public ListNode next;//指针域 //构造函数(无参)
public ListNode(){
} //构造函数(有一个参数)
public ListNode(int val){
this.val = val;
} //构造函数(有两个参数)
public ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
}

由以上结构的节点依次连接起来所形成的链叫单链表结构。

双链表的节点结构

Class Node<V> {
V value;
Node prev;
Node next;
}

对应到具体代码实现

class ListNode{
public int val;//数据域 public ListNode prev;//指向上一个节点,前指针
public ListNode next;//指向下一个节点,后指针 //构造函数
public ListNode(int a){
this.val = a;
}
}

由以上结构的节点依次连接起来所形成的链叫双链表结构。

如何使用链表

链表是一种数据结构

本质上是利用了"创建对象会产生地址"这一机制实现的(详见P3

使用链表的一个过程:定义链表节点类-->定义链表类-->为链表类编写一系列你需要的类方法(为了操控链表)-->在主类中实例化链表类并使用各种类方法达成目的

那现在链表节点定义完了,把这些节点按照定义给连接起来,就构成一个链表了

实例:翻转链表
疑问

我在刚接触链表的时候常常会有疑惑:

我到底需要完成哪些部分?

刷题时要写哪些部分?

下面通过一个示例来说明链表的完整实现过程

例子:实现链表的翻转(完整代码,包括main方法)

public class TestLinkedList {
public static void main(String[] args) {
//这里用手动连接节点的方式创建了一个链表
//要是你愿意也可以在MyLinkedList写一个方法来创建链表
ListNode head1 = new ListNode(1);
head1.next = new ListNode(2);
head1.next.next = new ListNode(3); MyLinkedList myLinkedList = new MyLinkedList();
myLinkedList.printLinkedList(head1);
head1 = myLinkedList.reverseList(head1);
myLinkedList.printLinkedList(head1);
}
}
// 定义一个链表节点类
class ListNode{
public int val;//数据域
public ListNode next;//指针域 //构造函数(无参)
public ListNode(){
}
//构造函数(有一个参数)
public ListNode(int val){
this.val = val;
}
//构造函数(有两个参数)
public ListNode(int val, ListNode next){
this.val = val;
this.next = next;
}
} //定义一个操控链表节点的类
class MyLinkedList {
// 创建一个单链表反转方法
public ListNode reverseList(ListNode head) {
ListNode pre = null; //指向当前节点的前一个节点的指针
ListNode cur = head; //指向当前节点的指针
ListNode tmp; //用于保存当前节点的下一节点,防止链表断掉
while (cur != null) {
//先将当前节点的后一个节点的地址保存
tmp = cur.next;
//将当前节点的后一个节点指针指向当前节点的前一个节点
cur.next = pre;
//将pre指向当前节点位置
pre = cur;
//将当前节点位置后移
//此时已经是2-1-3了
cur = tmp;
}
//等pre指到链表尾部(null)时结束并返回前一个值
//此时链表变为3-2-1
return pre;
}
//创建一个链表打印方法
public void printLinkedList(ListNode head) {
System.out.print("Linked List: ");
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
System.out.println();
}
}

这个例子中我尝试将使用链表这个数据结构的整个流程都写清楚

那么无非就分为两大部分:链表节点类操控链表节点的类

链表节点类

这里就只是单纯定义一个链表的节点应该是什么样的,其余的工作不用管

比如在LeetCode中,如果涉及链表的题,答题模板开头都会给出他们是怎么定义链表节点的

(类似这种)

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
操控链表节点的类

这里是实现"链表节点-->链表"的类

所有对于节点的操作都可以在这里定义

比如最基本的:创建节点、对节点进行CURD等

我们需要对节点实现的一些算法也需要以类方法的形式给出(比如例子中的翻转操作)

结论

在LeetCode时,涉及链表的题,我们需要写两个部分:

  • 创建节点的方法

​ 这没什么好说的,先要把人家给的链表节点连接成需要的链表

  • 操控节点的某种算法(以方法的形式实现)

​ 后台会去调用这个算法来验证你对于链表的操控情况

【Java复健指南15】链表LinkedList及其说明的更多相关文章

  1. 【Java复健指南09】项目练习全解--房屋出租系统

    一个基于文本界面的综合练习,主要用于串联和回忆知识点,比较简单 各个界面的设计样式 主菜单 =============房屋出租系统菜单============ 1 新 增 房 源 2 查 找 房 屋 ...

  2. java集合-链表LinkedList

    1.简介 LinkedList 底层使用的是 双向链表的数据结构 2.类图(JDK 1.8) 下图是LinkedList实现的接口和继承的类关系图: public class LinkedList&l ...

  3. Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. JAVA集合一:ArrayList和LinkedList

    JAVA集合一:ArrayList和LinkedList 参考链接: HOW2J.CN 前言 这几篇博客重点记录JAVA的几个重要的集合框架:ArrayList.LinkedList.HashMap. ...

  5. 链表LinkedList、堆栈Stack、集合Set

    链表LinkedList LinkedList 也像 ArrayList 一样实现了基本的 List 接口,但它在 List 中间执行插入和删除操作时比 ArrayList 更高效.然而,它在随机访问 ...

  6. Java工程师学习指南 完结篇

    Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...

  7. Java 集合框架(三)—— LinkedList

    三.链表 —— LinkedList ArrayList 虽然好用,但是数组和数组列表都有一个重大的缺陷:从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向 ...

  8. Java工程师学习指南(完结篇)

    Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...

  9. 数据结构之链表(LinkedList)(三)

    数据结构之链表(LinkedList)(二) 环形链表 顾名思义 环形列表是一个首尾相连的环形链表 示意图 循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活. 看一 ...

  10. Java工程师学习指南第8部分:分布式系统理论与实践

    本文整理了微信公众号[Java技术江湖]发表和转载过的分布式相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧. 细聊分布式ID生成方法 近期面试Java后端的一些感悟 本专栏介绍分布式的 ...

随机推荐

  1. JUC(7)四大函数式接口

    文章目录 1.四大函数式接口(必须掌握) 1.1 function 1.2 Predicate 1.3 Consumer 1.4 Supplier 1.四大函数式接口(必须掌握) 1.lambda表达 ...

  2. Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14

    目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...

  3. SpringBoot(三) - Ribbon客户端负载均衡,Zuul网关,Config配置中心

    1.Ribbon客户端负载均衡 1.1 依赖 1.2 配置信息 # feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询 # 负载均衡机制是添加在消费端(客户端)的,如果改为随机,指定服 ...

  4. 常用CSS样式属性

    01.常用样式 1.1.background背景 设置元素背景的样式 background,更好的衬托内容. 属性 描述 值 background 背景属性简写.支持多组背景设置,逗号,隔开 back ...

  5. 【lwip】11-UDP协议&源码分析

    目录 前言 11.1 传输层说明 11.2 UDP协议简介 11.3 UDP特点 11.4 UDP端口号 11.5 UDP报文 11.6 UDP伪首部和校验和 11.7 wireshark报文分析 1 ...

  6. 【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序

    最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享. PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI ...

  7. NC-UClient下载安装应用详解

    aliases: [] tags : " #NC " summary: [UClient下载安装NCC应用详解] product: [NCX] author : [yaenli] ...

  8. Atlassian Confluence 远程代码执行漏洞(CVE-2022-26134)漏洞复现

    目录 免责声明: Atlassian Confluence 远程代码执行漏洞(CVE-2022-26134)漏洞复现 漏洞概述: 影响版本: 漏洞复现: 利用POC: 利用过程: 修复建议: 参考 免 ...

  9. centos ssh 连接缓慢

    在连接apache,ssh,mysql等服务器时,如果出现连接过慢,可能的原因是dns 的反向查询.反向解析是防止假冒的IP连接服务器,把IP解析成域名,来提高安全性,看这个IP是否是伪造,这是dns ...

  10. Kubernetes基础_Service暴露的两种方式

    一.前言 kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一 ...