链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点。
listnode是自定义的一种链表结构,下面为链表的添加、遍历和替换的代码实现。初学有点难理解,多看几遍就会了。
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(); } }
需要理解jvm内存模型,在这里nextNode只是一个变量!!!类型为ListNode。
ListNode nextNode;//声明一个变量nextNode,为null值。相当于ListNode nextNode = null;
ListNode nodeSta = new ListNode(0);
可以分解为:
ListNode nodeSta;//声明一个变量nodeSta
nodeSta = new ListNode(0);//堆中创建对象(分配一段内存空间),并且把变量nodeSta指向了堆中的对象
变量都是在栈中的;
链表是一种数据结构:由数据和指针构成,链表的指针指向下一个节点。
所以链表结构是一个对象,在堆内存中有一块空间存储。链表的变量next指向着下一块堆内存的空间存储位置。