链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点。

java ListNode 链表 就是用Java自定义实现的链表结构。

基本结构:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
}

添加构造方法方便初始化:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}

范型写法:使用范型可以兼容不同的数据类型

class ListNode<E>{                //类名 :Java类就是一种自定义的数据结构
E val; //数据 :节点数据
ListNode<E> next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(E val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}

创建链表及遍历链表:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
} class Test{
public static void main(String[] args){ ListNode nodeSta = new ListNode(0); //创建首节点
ListNode nextNode; //声明一个变量用来在移动过程中指向当前节点
nextNode=nodeSta; //指向首节点 //创建链表
for(int i=1;i<10;i++){
ListNode node = new ListNode(i); //生成新的节点
nextNode.next=node; //把心节点连起来
nextNode=nextNode.next; //当前节点往后移动
} //当for循环完成之后 nextNode指向最后一个节点, nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 } //打印输出方法
static void print(ListNode listNoed){
//创建链表节点
while(listNoed!=null){
System.out.println("节点:"+listNoed.val);
listNoed=listNoed.next;
}
System.out.println();
} }

插入节点:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
} class Test{
public static void main(String[] args){ ListNode nodeSta = new ListNode(0); //创建首节点
ListNode nextNode; //声明一个变量用来在移动过程中指向当前节点
nextNode=nodeSta; //指向首节点 //创建链表
for(int i=1;i<10;i++){
ListNode node = new ListNode(i); //生成新的节点
nextNode.next=node; //把心节点连起来
nextNode=nextNode.next; //当前节点往后移动
} //当for循环完成之后 nextNode指向最后一个节点, nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 //插入节点
while(nextNode!=null){
if(nextNode.val==5){
ListNode newnode = new ListNode(99); //生成新的节点
ListNode node=nextNode.next; //先保存下一个节点
nextNode.next=newnode; //插入新节点
newnode.next=node; //新节点的下一个节点指向 之前保存的节点
}
nextNode=nextNode.next;
}//循环完成之后 nextNode指向最后一个节点
nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 } static void print(ListNode listNoed){
//创建链表节点
while(listNoed!=null){
System.out.println("节点:"+listNoed.val);
listNoed=listNoed.next;
}
System.out.println();
}
}

替换节点:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
} class Test{
public static void main(String[] args){ ListNode nodeSta = new ListNode(0); //创建首节点
ListNode nextNode; //声明一个变量用来在移动过程中指向当前节点
nextNode=nodeSta; //指向首节点 //创建链表
for(int i=1;i<10;i++){
ListNode node = new ListNode(i); //生成新的节点
nextNode.next=node; //把心节点连起来
nextNode=nextNode.next; //当前节点往后移动
} //当for循环完成之后 nextNode指向最后一个节点, nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 //替换节点
while(nextNode!=null){
if(nextNode.val==4){
ListNode newnode = new ListNode(99); //生成新的节点
ListNode node=nextNode.next.next; //先保存要替换节点的下一个节点
nextNode.next.next=null; //被替换节点 指向为空 ,等待java垃圾回收
nextNode.next=newnode; //插入新节点
newnode.next=node; //新节点的下一个节点指向 之前保存的节点
}
nextNode=nextNode.next;
}//循环完成之后 nextNode指向最后一个节点
nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 } //打印输出方法
static void print(ListNode listNoed){
//创建链表节点
while(listNoed!=null){
System.out.println("节点:"+listNoed.val);
listNoed=listNoed.next;
}
System.out.println();
}
}

删除节点:

class ListNode {        //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似 ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
} class Test{
public static void main(String[] args){ ListNode nodeSta = new ListNode(0); //创建首节点
ListNode nextNode; //声明一个变量用来在移动过程中指向当前节点
nextNode=nodeSta; //指向首节点 //创建链表
for(int i=1;i<10;i++){
ListNode node = new ListNode(i); //生成新的节点
nextNode.next=node; //把心节点连起来
nextNode=nextNode.next; //当前节点往后移动
} //当for循环完成之后 nextNode指向最后一个节点, nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出 //删除节点
while(nextNode!=null){
if(nextNode.val==5){
ListNode listNode=nextNode.next.next; //保存要删除节点的下一个节点
nextNode.next.next=null; //被删除节点 指向为空 ,等待java垃圾回收
nextNode.next=listNode; //指向要删除节点的下一个节点
}
nextNode=nextNode.next;
}//循环完成之后 nextNode指向最后一个节点
nextNode=nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出
} //打印输出方法
static void print(ListNode listNoed){
//创建链表节点
while(listNoed!=null){
System.out.println("节点:"+listNoed.val);
listNoed=listNoed.next;
}
System.out.println();
}
}

补充说明:

在对节点进行替换或删除的时候,被替换或被删节点的next引用需不需要设置为null?

答案是: 不需要,因为一个对象被回收的前提是因为没有任何地方持有这个对象的引用(引用计数器为0)也就是说它不在被引用,那么那么它将被回收,至于它引用什么对象无关紧要,因为对于它所引用的对象来说依然是看引用计数器是否为0;

java ListNode 链表的更多相关文章

  1. java ListNode链表数据结构

    class ListNode{ int val; ListNode next; } 该节点的值 val.   下一个节点  next

  2. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  3. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  4. Java 单向链表学习

    Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...

  5. java 单链表 练习

    练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...

  6. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  7. ListNode Java创建链表

    用了一种自创的比较简洁的方式来创建链表 class ListNode { //为了方便,这两个变量都使用pub1ic, //存放数据的变量,直接为int型 public int data; //存放结 ...

  8. Java实现链表反转(借助栈实现)

    public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } // 添加新的 ...

  9. java实现链表

    单链表 package com.voole.linkedlist; public class Test { public static void main(String[] args) { Linke ...

随机推荐

  1. JDK(JDK8,JDK11)高速下载

    JDK(JDK8,JDK11)高速下载 oracl 需要登陆才能下载,网速还贼慢. 华为云各版本高速下载通道:https://repo.huaweicloud.com/java/jdk/

  2. Idea 查找加替换 功能

    本页查找 快捷键:ctr+F 鼠标框选 所需内容 再加快捷键 查找更加方便 替换功能

  3. java ipv6发邮件需要注意的点

    和ipv4发邮件一样,毕竟ip只是用来找地址的,v4 v6使用上基本没区别. 但有一点得注意:java ipv6采用发送RST包来通知邮件服务器断开连接,这样会导致客户端抛 MessagingExce ...

  4. 第11.11节 Python正则表达式的指定重复次数匹配模式及元字符”{}”功能介绍

    在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "". "+"功能介绍>和<第11.10节 Pyth ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中部件的是否接受鼠标拖放事件的acceptDrops属性及含义

    acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件.如果部件接受 ...

  6. 判断wangeidtor中输入框内容为空

    在我做的项目中,产品没有要求图片多媒体等,暂时只需要标题正文表格之类的,在保存的时候校验内容不为空 刚开始考虑的是editor.txt.html()获取到html片段在判断标签中的值,但是太过繁琐 后 ...

  7. JavaScript:常用的一些数组遍历的方法

    常用的一些遍历数组的方法: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. Vscode:常用的插件

    Chinese (Simplified) Language Pack for Visual Studio Code==>汉化 Live Server==>运行代码 ESLint==> ...

  9. 【ubantu 安装Jmeter和Jdk环境】

    Linux环境安装Java(含安装包下载地址) 一定要使用有权限的用户 1.下载JDK压缩包,下载地址:https://blog.csdn.net/duketyson2009/article/deta ...

  10. docker 连接MySQL&#183;集群

    1 指定端口 docker run -p 3307:3306 --name root -e MYSQL_ROOT_PASSWORD=root -d mysql # 6380 root password ...