写在前面
今天写代码的时候,发现我居然被Java的ListNode的输入卡了半天,所以就打算写一篇博客来整理一下ListNode。
链表的定义
首先ListNode就是链表,它的基本结构如下:
及一个包含数据,和指针的结构,我们将一个节点的指针的节点指向下一个节点,这样就形成了一串链式结构,并称之为:链表。
所以对于链表的定义如下:
/**
* Java ListNode 链表的各种定义方法
*
* @作者(yequan17)
* @版本(2021.12.6)
*/
public class JListNode
{
/**
* 基本结构
*/
class ListNodeBasicStructure{
//类名:Java类就是一种自定义的数据结构。
int val; //数据:节点数据。
ListNodeBasicStructure next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
}
/**
* 添加构造方法方便初始化
*/
class ListNodeConstructor{
//类名:Java类就是一种自定义的数据结构。
int val; //数据:节点数据。
ListNodeConstructor next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
ListNodeConstructor(int val){
//构造方法:构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
/**
* 范型写法:使用范型可以兼容不同的数据类型
*/
class ListNodeParadigm<E>{
//类名:Java类就是一种自定义的数据结构。
E val; //数据:节点数据。
ListNodeParadigm<E> next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
ListNodeParadigm(E val){
//构造方法:构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
}
我们逐个来看:
/**
* 基本结构
*/
class ListNode{
//类名:Java类就是一种自定义的数据结构。
int val; //数据:节点数据。
ListNode next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
}
这是最基本的链表结构,即一个数据一个指向下一个节点的指针或者说是指向下一个节点对象的引用。
但是这不并能满足我们的需要,因为我们在使用一个对象前必须对其进行初始化,如果不初始化,Java也会对其进行初始化。
所以我们将其修改为:
/**
* 添加构造方法方便初始化
*/
class ListNode{
//类名:Java类就是一种自定义的数据结构。
int val; //数据:节点数据。
ListNode next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
ListNode(int val){
//构造方法:构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
这就足够了吗?当然不是,有时候我们需要的可能并不是一个包含整型数据的链表,它也可能是浮点型,甚至是一个一个对象,所以就有了范型下链表的表示:
/**
* 范型写法:使用范型可以兼容不同的数据类型
*/
class ListNode{
//类名:Java类就是一种自定义的数据结构。
E val; //数据:节点数据。
ListNode<E> next; //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
ListNode(E val){
//构造方法:构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
链表的基本操作
好的在上面我们已经知道了链表是如何定义的,那么接下来,我们就来对链表进行一些最基本的在操作吧,它包括遍历链表、插入一个新的节点、置换一个节点和删除一个节点。
我们先来看链表的遍历。
再看一遍链表的结构,遍历链表就像遍历数组一样,从头到尾一个一个走就行,和数组不一样的是,我们遍历数组是根据数组的下标从零开始,依次前进。那么如何遍历链表呢?
我们发现,现在有两个问题摆在我们的面前:
- 怎么找到链表的头部,或者说,遍历应该从哪里开始呢?
- 怎么找