Java版数据结构插入数据时遇到的结点为空的问题详解

网友投稿 300 2022-12-27


Java版数据结构插入数据时遇到的结点为空的问题详解

在演示java版数据结构与算法教材中的头插法代码时遇到了空结点问题 。 先上代码。

链表类

import java.util.Scanner;

public class ListLinked {

ListLinkedNode head=new ListLinkedNode();//声明头结点

//添加结点

public void addFromHead(int e){

ListLinkedNode p=new ListLinkedNode();//声明并创建结点p为插入结点

p.setData(e);

p.setNext(head.getNext());

head.setNext(p);//将p插入到头结点后

}

//头插法创建链表

public static ListLinked createFromHead() {

ListLinked listLinked=new ListLinked<>();//初始化链表

System.out.println("-头插法建立链表-");

System.out.println("请输入链表长度:");

Scanner sc=new Scanner(System.in);

//n : 链表长度

int n=sc.nextInt();

System.out.println("请输入值:");

for(int i=0;i

System.out.print("请输入第"+(i+1)+"个值:");

int e=sc.nextInt();

listLinked.addFromHead(e);

}

System.out.println("链表创建完毕");

return listLinked;

}

//输出

public void display() {

System.out.println("{");

ListLinkedNode p=new ListLinkedNode();

p=head.getNext();

while(p!=null) {

int value=p.getData();

System.out.println(value);

p=p.getNext();

}

System.out.println("}");

}

}

节点类

public class ListLinkedNode{

//数据成员

private T data;

private ListLinkedNode next;

//获得数据域

public T getData() {

return data;

}

//设置数据域

public void setData(T data) {

this.data=data;

}

//得到指针域

public ListLinkedNode getNext(){

return next;

}

//设置指针域

public void setNext(ListLinkedNode next) {

this.next=next;

}

//有参构造函数

public ListLinkedNode(T data) {

this.data=data;

this.next=null;

}

//无参构造函数

public ListLinkedNode() {

}

}

测试类

public class test {

public static void main(String[] args) {

ListLinked list=new ListLinked();

list.createFromHead();

list.display();

}

}

测试,在判断p是否为空执行输出的时候,p一直为null。

打断点调试的时候发现了问题所在。

因为java把引用类型当作了指针,所以在addFromHead方法里,head里的next存的是p对象的地址。

当出了addFromHead方法,局部变量p的生命周期结束被垃圾回收机制带走

栈中没有变量再指向之前在堆中的p对象,所以堆中的对象也被当作了垃圾被带走,head的next又变成了null

以上就是Java版数据结构插入数据时遇到的结点为空的问题的全部内容,感谢大家对我们的支持。

System.out.print("请输入第"+(i+1)+"个值:");

int e=sc.nextInt();

listLinked.addFromHead(e);

}

System.out.println("链表创建完毕");

return listLinked;

}

//输出

public void display() {

System.out.println("{");

ListLinkedNode p=new ListLinkedNode();

p=head.getNext();

while(p!=null) {

int value=p.getData();

System.out.println(value);

p=p.getNext();

}

System.out.println("}");

}

}

节点类

public class ListLinkedNode{

//数据成员

private T data;

private ListLinkedNode next;

//获得数据域

public T getData() {

return data;

}

//设置数据域

public void setData(T data) {

this.data=data;

}

//得到指针域

public ListLinkedNode getNext(){

return next;

}

//设置指针域

public void setNext(ListLinkedNode next) {

this.next=next;

}

//有参构造函数

public ListLinkedNode(T data) {

this.data=data;

this.next=null;

}

//无参构造函数

public ListLinkedNode() {

}

}

测试类

public class test {

public static void main(String[] args) {

ListLinked list=new ListLinked();

list.createFromHead();

list.display();

}

}

测试,在判断p是否为空执行输出的时候,p一直为null。

打断点调试的时候发现了问题所在。

因为java把引用类型当作了指针,所以在addFromHead方法里,head里的next存的是p对象的地址。

当出了addFromHead方法,局部变量p的生命周期结束被垃圾回收机制带走

栈中没有变量再指向之前在堆中的p对象,所以堆中的对象也被当作了垃圾被带走,head的next又变成了null

以上就是Java版数据结构插入数据时遇到的结点为空的问题的全部内容,感谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java字节缓冲流原理与用法详解
下一篇:小红书接口测试工具(小红书api接口)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~