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

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

链表类

import java.util.Scanner;

 public class ListLinked<T> {
     ListLinkedNode<Integer> head=new ListLinkedNode<Integer>();//声明头结点
    //添加结点
    public  void addFromHead(int e){
        ListLinkedNode<Integer> p=new ListLinkedNode<Integer>();//声明并创建结点p为插入结点
        p.setData(e);
        p.setNext(head.getNext());
        head.setNext(p);//将p插入到头结点后
    }
    //头插法创建链表
    public static ListLinked<Integer> createFromHead() {
        ListLinked<Integer> 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<n;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<Integer> p=new ListLinkedNode<Integer>();
        p=head.getNext();
        while(p!=null) {
            int value=p.getData();
            System.out.println(value);
            p=p.getNext();
        }
        System.out.println("}");
    }

}

节点类

public class ListLinkedNode<T>{
    //数据成员
    private T data;
    private ListLinkedNode<T> next;
    //获得数据域
    public T getData() {
        return data;
    }
    //设置数据域
    public void setData(T data) {
        this.data=data;
    }
    //得到指针域
    public ListLinkedNode<T> getNext(){
        return next;
    }
    //设置指针域
    public void setNext(ListLinkedNode<T> 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

原文地址:https://www.cnblogs.com/zrx7/p/11495120.html

时间: 2024-10-18 20:13:58

Java版数据结构插入数据时遇到的结点为空的问题的相关文章

inserted触发器,一张表插入数据时,同时向另外一张表插入数据

有时候,一个服务器上有多个数据库,需要向其中一个数据库的表中插入数据时, 同时向另外一个数据的表里插入数据. 可以利用触发器和同义词(建立同义词的方法省略), 在一个数据库的表里插入数据时,同时向另外一个数据库的表里插入数据. 触发器代码如下: create trigger userInsertTrigger on [user] for insert as begin begin insert into usertab(UserID,UserAccount,UserPassword,UserNa

MySQL插入数据时插入无效的列

1.错误描述 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field list' 2.错误原因 数据库表中的字段:sno     sname    sage     ssex 插入数据时:          sno     sname    sage     man          本来是想插入ssex这个字段的值为"man",结果将man弄成了ssex字段名 3.

20140509-MySQL导入脚本文件,插入数据时显示乱码的解决办法

20140509-MySQL导入脚本文件,插入数据时显示乱码的解决办法 打开CMD输入以下命令: mysql –u root –p 然后输入密码: 在导入脚本文件之前,对字符编码进行设置: charset gbk; 说明:上面的这条语句非常关键,这样不论你在cmd窗口,还是使用客户端输入中文,都能够正确保存了. 建议初学者不要使用SQLyog或者Navicat Premium等客户端连接工具.

mysql插入数据时返回出入数据ID

INSERT INTO user_info (name,gender,height,age)VALUES('sa','女','120','12');SELECT @@IDENTITY @@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量.一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头.比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@i

Mybatis + Mysql 插入数据时中文乱码问题

近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱码,一般有两种情况: 数据库本身设置 连接数据库时,jdbc的编码设置 对于第一种情况,可以查看自身的mysql设置: show variables like '%character%' 显示指定编码可解决问题: <!-- 1. 数据源 : DriverManagerDataSource -->

SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法

原文:SqlBulkCopy批量插入数据时,不执行触发器和约束的解决方法 在new SqlBulkCopy对象的时候,设置一下SqlBulkCopyOptions选项即可,按位或运算 SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints using (SqlBulkCopy bulkCopy = new SqlBulkCopy(GlobalString.ConnectionString, SqlBulkCopy

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误

操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报ORA-00984列在此处不允许异常. 可以创建TestUser表,如下: create table TestUser ( usercode char(5), username varchar2(20) ) 以下例子请注意第一个字段usercode的值 1.正常例子:usercode为纯数字.可以正常插

Java JDBC批处理插入数据操作

在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据.此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作. 首先,使用Java JDBC基本的API批量插入数据到数据库中. Simple Batch - 简单批处理    我把它叫做简单批处理.要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能. 想想一下下面的代码: Bad

向数据库中插入数据时字符集或查询是数据无法正常显示出现乱码问题

当向数据库插入数据出错或出局无法正常显示出现乱码时.首先应该想到的是数据库的编码问题.查看当前数据库服务器默认对数据库处理的字符集 show variables like  'character_set%'; character_set_client: 默认客户端来的数据格式 character_set_connection : 连接层字符集 character_set_database:  当前数据库字符集 character_set_results:服务器给外部的字符集 假如客户端字符集与数