目录
ListNode链表的基本结构
链表:链表是一种数据结构,由数据和指针构成,链表的指针指向下一个节点的位置。
Java ListNode链表:就是用Java自定义实现的链表结构。
由于Java中没有指针的概念,Java中的引用就类似于C语言中的指针的意思。
Java ListNode的基本结构:
public class ListNode { //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
}
添加构造方法方便初始化(给链表赋值的方法):
public class ListNode { //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
创建链表和遍历链表
public static void main(String[] args) {
ListNode l1 = new ListNode(0); //创建链表的首节点,赋值为0
//注意l1是首节点,而不是链表的名字
ListNode p = l1 ;//声明一个变量在移动过程中充当节点
p.next = new ListNode(1); //创建链表的下一个节点,并赋值
p = p.next; //将指针的位置指向当前节点
for(int i=2;i<=10;i++) {
ListNode l2 = new ListNode(i); //生成新的节点
p.next = l2 ; //把新节点连起来
p = p.next; //当前节点往后移动
}
p = l1; //重新赋值让指针指向首节点
print(p); //打印输出
}
//打印输出方法
private static void print(ListNode p) {
while(p!=null) {
System.out.println(p.val);
p = p.next;
}
System.out.println();
}
插入节点
在0,1,2,3的链表中2和3的位置中间添加一个新的节点7:
public static void main(String[] args) {
ListNode l1 = new ListNode(0); //创建链表的首节点,赋值为0
//注意l1是首节点,而不是链表的名字
ListNode p = l1 ;//声明一个变量在移动过程中充当节点
p.next = new ListNode(1); //创建链表的下一个节点,并赋值
p = p.next; //将指针的位置指向当前节点
p.next = new ListNode(2);
p = p.next;
p.next = new ListNode(3);//此时指针还在值为2的节点的地方
//插入节点,在2和3中插入一个值为7的节点
ListNode newNode = new ListNode(7);//生成一个新的节点
ListNode node = p.next; //将值为3的节点的位置存起来
p.next = newNode ;//插入新节点
newNode.next = node;//新节点的下一个节点指向之前保存的节点
}
替换节点
在0,1,2,3的链表中将2替换成7:
public static void main(String[] args) {
ListNode l1 = new ListNode(0); //创建链表的首节点,赋值为0
//注意l1是首节点,而不是链表的名字
ListNode p = l1 ;//声明一个变量在移动过程中充当节点
p.next = new ListNode(1); //创建链表的下一个节点,并赋值
p = p.next; //将指针的位置指向当前节点
p.next = new ListNode(2);
p = p.next;
p.next = new ListNode(3);//此时指针还在值为2的节点的地方
p = p.next;
p = l1;
print(p);
//替换节点
ListNode newNode = new ListNode(7);//创建一个新的节点,估值为7
while(p!=null) {
if(p.val==1) {
ListNode node = p.next.next;//将需要替换的下一个节点的位置保存起来
p.next.next = null;//被替换的节点,指向为空,等待被Java垃圾回收
p.next = newNode ;//插入新节点
newNode.next = node;//新节点的下一个节点指向之前保存的节点
}
p = p.next;
}
p = l1;
print(p);
}
//打印输出方法
private static void print(ListNode p) {
while(p!=null) {
System.out.println(p.val);
p = p.next;
}
System.out.println();
}
删除节点
删除链表0,1,2,3中的2节点
public static void main(String[] args) {
ListNode l1 = new ListNode(0); //创建链表的首节点,赋值为0
//注意l1是首节点,而不是链表的名字
ListNode p = l1 ;//声明一个变量在移动过程中充当节点
p.next = new ListNode(1); //创建链表的下一个节点,并赋值
p = p.next; //将指针的位置指向当前节点
p.next = new ListNode(2);
p = p.next;
p.next = new ListNode(3);//此时指针还在值为2的节点的地方
p = p.next;
p = l1;
print(p);
//删除节点
while(p!=null) {
if(p.val==1) {
ListNode node = p.next.next; //将要删除节点的下一个节点位置存起来
p.next.next = null ;//被删除节点指向为空,等待java垃圾回收
p.next = node ;//指向要删除节点的下一个节点
}
p = p.next;
}
p = l1;
print(p);
}
private static void print(ListNode p) {
while(p!=null) {
System.out.println(p.val);
p = p.next;
}
System.out.println();
}
ListNode链表的注意事项
1、定义链表时,ListNode l1 = new ListNode(0); 该语句表示,创建了一个链表,链表的首节点为0,其中l1代表的是首节点,而不是链表的名字。
2、不需要定义链表的长度。
3、赋值语句为xx.next = new ListNode(4);此时指针的位置还在上一个节点的位置。
可以参考力扣第二题(两数相加)学习