Java数据结构--单链表

一.链表的定义

链表是一种递归的数据结构,它或者为空( null),或者是含有泛型元素的结点和指向另一条链表的引用。链表是一种线性表,但是并不会按线性的顺序储存数据,而是在每一个节点里存到下一个节点的地址。

链表可分为单向链表和双向链表,下面我们主要了解单向链表,如图便为单向链表的结构

968b18cdc92c4daaa70bd941f5338862.jpg

二.Java API中LinkedList类的方法摘要

我们在实现单向链表之前,先了解一下Java API中LinkedList类的方法摘要,并学会如何去创建使用链表,熟练运用其中常用的几种方法(增删差)

下面为LinkedList类中的所有方法摘要

f53262aaadcb4de89d4f7ef8a389c8a5.jpg

看到这么多方法,是不是头都大了,但不要慌,我们只需熟练掌握其中最常用的几种方法即可,其余的只需了解。

下面我们来运行一下其中最常用的几种方法

(我们要实现的也是以下主要方法)

addFirst(元素) 将指定元素添加到链表开头

add(元素)将指定元素添加到链表结尾

add(元素,要插入的位置)将指定元素添加到指定位置

get(索引) 获取指定位置的索引

removeFirst(删除链表开头元素

remove(索引) 删除指定位置元素

bc0d05b94a2941719b08c6a506a9450a.jpg

52349f9c4f4040ec8cc447354ef8203e.png 

三.链表常用方法的代码实现(要先了解泛型)

都了解了链表的主要方法了吗?那么下面我们就以此来实现它们吧

1.结点(Node)的创建

一个Node对象含有两个成员变量,分别为Val(参数)和next(节点),其中Val是在该节点处要储存的元素,next是下一个节点的地址。

下面我们来创建一个节点的标准JavaBean类

b6d9ab3d5c144d489b759b8168c9b0ae.png

 2.如何构造链表

根据递归定义,我们只需要一个Node类型的变量就能表示一条链表,只要保证它的值是null或者指向另一个Node对象且该对象的next指向了另一条链表即可

为了方便我们的操作,对于链表我们需要定义一个头节点head,只要知道头节点我们就可以访问此链表中的所有节点

39ac081b6f9b448f9cd3621e9f46661b.jpg 

在构造方法中我们初始化头节点的next指向null,表示空链表

6496a77453f54bfd8cea7434d5f5cde6.jpg

3.代码实现

①addFirst(元素) 将指定元素添加到链表开头

思路:首先创建一个节点newNode储存要插入的元素val

情况一:当要插入的链表为空,即头结点指向null,我们就直接将head的next指针指向newNode

aa998f2f8b1b4e0e81b2904e5e8e740f.jpg

情况二:当要插入的链表不为空,我们就将newNode的指针指向head.next (头节点指向的节点),再将head的指针指向newNode

99c019f46f454b3793366d0d81bda3c6.jpg

最后我们都是将头节点指向newNode,两种情况只有newNode的指针指向不同,因此我们可以将情况一视为情况二的一种,从而简化代码

e646060dfc124c2b9787fd84ab443629.jpg

② add(元素)将指定元素添加到链表结尾

思路:首先创建一个节点newNode储存要插入的元素val

情况一:当链表为空,我们直接将头节的指针指向newNode

3a3638ba88924ecaabb680bcdcc9ca1c.jpg

情况二:当链表不为空,我们找到最后一个节点,再将它的指针指向newNode

a5676303138f47619e75d17bd527908d.jpg

 4647fe3de7924bd19cd2726ca89a3f5a.jpg

 ③add(元素,要插入的位置)将指定元素添加到指定位置

思路:要在指定位置插入元素,那么我们就要有一个下标i来寻找要插入的位置,我们插入元素需要更改该节点上一个节点next指针以及新节点newNode的next指针,所以在寻找过程中,我们也要找到要插入节点的上一个节点

698ec6d23a9f4f4981fd1f484053053b.jpg 

若要插入的节点超过了链表的长度,那么我们就抛出异常

517833d3052f486e9dece49e521507e7.jpg

 ④get(索引) 获取指定位置的索引

思路:根据下标找到要获取元素的位置,返回此节点的值val(同数组遍历一样)

c95459cf28314ce68c37e56501c89ee5.jpg

⑤ removeFirst(删除链表开头元素

思路:

情况一:当链表为空,抛出异常

情况二:将头节点的指针指向要删除的节点的下一个节点

ccfa9779535b4b279cc9b1d2c85d50b5.jpg

fe6974e3894043fdb4c7fc7a0b7461f1.jpg 

⑥ remove(索引) 删除指定位置元素

思路:情况一:链表为空则抛出异常

情况二:在寻找位置时,我们是从头节点开始寻找的,因此我们找到位置时的节点就是要删除节点上一个节点,因此我们无法知道要删除的节点是否为null

因此我们在寻找到位置删除是也存在两种特殊情况

Ⅰ.当我们要删除的节点不为null

直接将要删除节点的上一个节点指向要删除节点的下一个节点

21b440360b1546daabacd6c76ad4ff69.jpg

 Ⅱ.当我们要删除的节点为null,那么根据Ⅰ,要删除节点的下一个节点就不存在,我们无法获取,即要删除的节点为null且恰好为链表的长度+1

e860c916ca4d40be965e2d109356c5a6.jpg

 305895e91f1b438c80cb617bd80e25ae.jpg

 4.结果显示

代码都写完了没?下面我们就运行一下自己写的代码爽一下吧

332d8196e2cc49debf8fea8dd2b7e08c.jpg

 c697baff44e64261aac20faf1ce5bf56.jpg

各位都实现了吗?

四:链表必刷题(根据自己情况) 

①力扣21 合并两个有序链表

②剑指Offer 06.从尾到头打印链表

③力扣160 相交链表

④力扣2 两数相加(此题被大多数人称为梦破碎的地方⌓‿⌓)

注:若有错误,不足之处,望各位指出更正₍˄·͈༝·͈˄*₎◞ ̑̑

 

 

 

 

 

 

 

 

 

 

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值