一.链表的定义
链表是一种递归的数据结构,它或者为空( null),或者是含有泛型元素的结点和指向另一条链表的引用。链表是一种线性表,但是并不会按线性的顺序储存数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表,下面我们主要了解单向链表,如图便为单向链表的结构
二.Java API中LinkedList类的方法摘要
我们在实现单向链表之前,先了解一下Java API中LinkedList类的方法摘要,并学会如何去创建使用链表,熟练运用其中常用的几种方法(增删差)
下面为LinkedList类中的所有方法摘要
看到这么多方法,是不是头都大了,但不要慌,我们只需熟练掌握其中最常用的几种方法即可,其余的只需了解。
下面我们来运行一下其中最常用的几种方法
(我们要实现的也是以下主要方法)
addFirst(元素) 将指定元素添加到链表开头
add(元素)将指定元素添加到链表结尾
add(元素,要插入的位置)将指定元素添加到指定位置
get(索引) 获取指定位置的索引
removeFirst(删除链表开头元素
remove(索引) 删除指定位置元素
三.链表常用方法的代码实现(要先了解泛型)
都了解了链表的主要方法了吗?那么下面我们就以此来实现它们吧
1.结点(Node)的创建
一个Node对象含有两个成员变量,分别为Val(参数)和next(节点),其中Val是在该节点处要储存的元素,next是下一个节点的地址。
下面我们来创建一个节点的标准JavaBean类
2.如何构造链表
根据递归定义,我们只需要一个Node类型的变量就能表示一条链表,只要保证它的值是null或者指向另一个Node对象且该对象的next指向了另一条链表即可
为了方便我们的操作,对于链表我们需要定义一个头节点head,只要知道头节点我们就可以访问此链表中的所有节点
在构造方法中我们初始化头节点的next指向null,表示空链表
3.代码实现
①addFirst(元素) 将指定元素添加到链表开头
思路:首先创建一个节点newNode储存要插入的元素val
情况一:当要插入的链表为空,即头结点指向null,我们就直接将head的next指针指向newNode
情况二:当要插入的链表不为空,我们就将newNode的指针指向head.next (头节点指向的节点),再将head的指针指向newNode
最后我们都是将头节点指向newNode,两种情况只有newNode的指针指向不同,因此我们可以将情况一视为情况二的一种,从而简化代码
② add(元素)将指定元素添加到链表结尾
思路:首先创建一个节点newNode储存要插入的元素val
情况一:当链表为空,我们直接将头节的指针指向newNode
情况二:当链表不为空,我们找到最后一个节点,再将它的指针指向newNode
③add(元素,要插入的位置)将指定元素添加到指定位置
思路:要在指定位置插入元素,那么我们就要有一个下标i来寻找要插入的位置,我们插入元素需要更改该节点上一个节点next指针以及新节点newNode的next指针,所以在寻找过程中,我们也要找到要插入节点的上一个节点
若要插入的节点超过了链表的长度,那么我们就抛出异常
④get(索引) 获取指定位置的索引
思路:根据下标找到要获取元素的位置,返回此节点的值val(同数组遍历一样)
⑤ removeFirst(删除链表开头元素
思路:
情况一:当链表为空,抛出异常
情况二:将头节点的指针指向要删除的节点的下一个节点
⑥ remove(索引) 删除指定位置元素
思路:情况一:链表为空则抛出异常
情况二:在寻找位置时,我们是从头节点开始寻找的,因此我们找到位置时的节点就是要删除节点上一个节点,因此我们无法知道要删除的节点是否为null
因此我们在寻找到位置删除是也存在两种特殊情况
Ⅰ.当我们要删除的节点不为null
直接将要删除节点的上一个节点指向要删除节点的下一个节点
Ⅱ.当我们要删除的节点为null,那么根据Ⅰ,要删除节点的下一个节点就不存在,我们无法获取,即要删除的节点为null且恰好为链表的长度+1
4.结果显示
代码都写完了没?下面我们就运行一下自己写的代码爽一下吧
各位都实现了吗?
四:链表必刷题(根据自己情况)
①力扣21 合并两个有序链表
②剑指Offer 06.从尾到头打印链表
③力扣160 相交链表
④力扣2 两数相加(此题被大多数人称为梦破碎的地方⌓‿⌓)
注:若有错误,不足之处,望各位指出更正₍˄·͈༝·͈˄*₎◞ ̑̑