单链表按照指定顺序插入节点(代码实现)
具体代码如下:
public void addByOrder(HeroNode heroNode){
HeroNode temp = head;
boolean flag = false;
while(true){
if(temp.next == null){
break;
}
if(temp.next.no > heroNode.no){
break;
}else if(temp.next.no == heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入\n",heroNode.no);
}else{
heroNode.next = temp.next;
temp.next = heroNode;
}
}
}
- 使用这方法在链表中添加结点的时候是根据结点的no属性值来判断添加的位置的,下面我们来做一个测试,我们不按照no的顺序添加结点,我们看遍历出来的结果是怎样的
测试代码如下:
package com.ffyc.linkedlist;
public class SingleLinkedListTest2 {
public static void main(String[] args) {
HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
HeroNode hero3 = new HeroNode(3,"吴用","智多星");
HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addByOrder(hero1);
singleLinkedList.addByOrder(hero4);
singleLinkedList.addByOrder(hero3);
singleLinkedList.addByOrder(hero2);
singleLinkedList.list();
}
}
- 这个时候我们可以发现我们添加结点的时候是按照1,4,3,2的顺序添加的,但是我们遍历的时候我们可以发现我们输出的时候是按照1,2,3,4的顺序遍历的,为什么?
- 我们遍历还是从头到尾进行遍历的,但是这个时候遍历的顺序就是1,2,3,4 ,那么这个时候其实是因为我们添加元素的时候不是调用的我们之前声明的add()方法,而是调用我们新创建的addByOrder()方法来添加的元素,而我们的addByOrder()方法添加结点的时候是根据添加的结点的no属性来添加的
- 所以这个时候我们添加的时候是先添加的hero1结点,添加hero1结点的时候表中是没有结点的(除了头结点以外),所以直接就将hero1结点添加到了头结点之后的位置上,添加第二个节点的时候是添加的hero4节点,这个时候hero4节点的no属性值比hero1节点的no属性的值要大,所以我们经过addByOrder()方法添加的时候最终temp辅助指针就会停留在链表中最后一个节点的位置上,这个时候我们的hero4自然就是连接到了我们的链表中的最后一个节点的后面了, 然后我们添加第三个结点的时候添加的是hero3,这个时候我们的hero3的no属性要比hero4的no属性的值小,这个时候也就是我们的hero3要添加到我们的hero1和hero4之间的位置上,然后我们添加第四个节点的时候我们是添加的hero2结点,这个时候我们的hero2结点比hero3结点的no属性小,比hero1结点的no属性大,所以这个时候我们的hero2结点就是要添加到我们的hero3和hero4中间的位置上,所以最终添加完成之后我们的结点的在单链表中的存储顺序就是: hero1 --> hero2 —> hero3 —> hero4 ,所以我们遍历的顺序才是hero1,hero2,hero3,hero4