链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点
java ListNode链表就是用java自定义实现的链表结构。
基本结构:
class ListNode { //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
}
添加构造方法方便初始化:
class ListNode { //类名 :Java类就是一种自定义的数据结构
int val; //数据 :节点数据
ListNode next; //对象 :引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似
ListNode(){
}
ListNode(int val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
ListNode(int val, ListNode next) {
this.val = val;//把接收的参数赋值给当前类的val变量
this.next = next; //把接收的参数赋值给当前类的next变量
}
}
范型写法:使用范型可以兼容不同的数据类型:
class ListNode<E>{ //类名 :Java类就是一种自定义的数据结构
E val; //数据 :节点数据
ListNode<E> next;
ListNode(E val){ //构造方法 :构造方法和类名相同
this.val=val; //把接收的参数赋值给当前类的val变量
}
}
使用案例:
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
//打印输出方法
static void print(ListNode listNoed){
while(listNoed!=null){
System.out.println("节点:"+listNoed.val);
listNoed=listNoed.next;
}
}
@Test
public void test1() {
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;//把当前节点往后移动 也就是说next后的对象下的next为null
}//当for循环完成子后,nextNode指向最后一个节点
nextNode = nodeSta;//重新赋值让它指向首节点
print(nextNode);//打印输出
//替换节点
while (nextNode != null) {
if (nextNode.val == 4) {
ListNode newnode = new ListNode(99); //生成新的节点
newnode.next = nextNode.next.next;//先保存要替换节点的下二个节点 保存到新节点的下一个节点
nextNode.next = newnode; //新节点的下一个节点指向 之前保存的节点
}
nextNode = nextNode.next;
}//循环完成之后 nextNode指向最后一个节点
nextNode = nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出
//插入节点
while (nextNode != null) {
if (nextNode.val == 5) {
ListNode newnode = new ListNode(99); //生成新的节点
ListNode node = nextNode.next; //先保存下一个节点
newnode.next = node; //新节点的下一个节点指向 之前保存的节点
nextNode.next = newnode; //插入新节点
}
nextNode = nextNode.next;
}//循环完成之后 nextNode指向最后一个节点
nextNode = nodeSta; //重新赋值让它指向首节点
print(nextNode); //打印输出
}
下面是创建链表时的调试: