中羊 2020-07-11 17:10 采纳率: 0%
浏览 273

addByorder方法中temp = temp.next后temp为什么还是null

看了一遍网上的单链表博客,大家都是看同一个老师的视频抄一遍的呢。
我自己重新写了一遍,思路差不多
与视频的区别在于我没有使用flag来标识,而是直接在while(true)中的条件里进行插入
debug的时候发现,问题在于 addByOrder方法中 temp = temp.next 后移还是null
???明明和add方法里是一样的逻辑

public static void main(String[] args) {
    //创建节点,此处不需要实例化listNode类
    listNode people1 = new listNode(1,"小红","男");
    listNode people2 = new listNode(2,"小明","女");
    listNode people3 = new listNode(3,"小光","男");

    listLinked listlinked = new listLinked();
    //不按顺序
    listlinked.add(people2);
    listlinked.add(people3);
    listlinked.add(people1);
    listlinked.list();//显示一把
    //按照顺序
    listlinked.addByorder(people2);
    listlinked.addByorder(people3);
    listlinked.addByorder(people1);
    listlinked.list();//显示一把

}

//每一个listNode对象就是一个节点
class listNode{   
    //以后不要给类名起一个 和 类型名称 一样的名字,区别不开!
    public int no;//编号
    public String name;//名字
    public String male;//性别
    public listNode next;//指向下一个节点
    //构造器
    public listNode(int No,String Name,String Male) {

            this.no = No;
            this.name = Name;
            this.male = Male;
            }
    //为了显示方便,重新toString
    @Override
    public String toString() {
    return "listNode [no=" + no + ", name=" + name + ",
    male=" + male + "]";
    }

}
class listLinked{
    //初始化头节点,不存在任何数据
    private listNode head = new listNode(0,"","");
    private listNode next;
    //添加节点到表中
    public void add(listNode listNode) {                //创建一个辅助节点,并将它放到链表最后
        listNode temp = head;
        while(true) {
            if(temp.next == null) {//找到最后
            break;
            }else {
            temp = temp.next;//不是最后就将temp往后移位
            }           
        }
        temp.next = listNode;
        // 退出while后,temp的指针指向新的节点
        //这里没问题
    }

    //显示链表
    public void list() {
        //先判断链表是否为空
        if(head == null) {
        System.out.println("链表为空!");
        return;
    }
        listNode temp = head.next;
        while(true) {
        //是否到链表最后
        if(temp == null) {
        break;
        }
        //不为空就显示信息
        System.out.println(temp);
        temp = temp.next;
        //后移,这里也没有问题
        }
    }
//按顺序存放
public void addByorder(listNode listNode) {     
    listNode temp = head;
    //判断栈是否已经满了,说白了就是辅助指针是否指向链表最后了
    while (true) {
    //条件1
    if (temp.next == null) {
        break;
    } 
    //条件2 和 3
    if (listNode.no != temp.next.no) {
        // 找到插入位置
        if (listNode.no > temp.no && listNode.no < temp.next.no) {
            // 这里其实不需要前面的判断条件,但是一定要后面的条件
            System.out.println("现在可以插入元素了!");
            listNode.next = temp.next;
            temp.next = listNode;
            break;
        }
    } else {
    System.out.println("准备插入的信息已经存在!");
    break;
    }           
}
//此时退出while循环
temp = temp.next;// 以上条件都不满足,继续向下移  
//这里有问题...为什么向后移还是null



/*
* 视频写法:先找到,再判断是否存在。通过判断flag来添加与否 
* if(temp.next.no > listnode.no){ break; }
* if(temp.next.no == listnode.no){ flag = true; break; } 
* if(flag == true){Sout("已经存在该元素") } 
* else{执行两条语句}
*
*/

}

问题就是addByorder中temp向后移是null

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-07-11 23:04
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 虚心请教几个问题,小生先有礼了
  • ¥30 截图中的mathematics程序转换成matlab