看了一遍网上的单链表博客,大家都是看同一个老师的视频抄一遍的呢。
我自己重新写了一遍,思路差不多
与视频的区别在于我没有使用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