需求:
代码:
public class Demo01 { public static void main(String[] args) { LinkedListDemo linkedListDemo=new LinkedListDemo(); HeroNode heroNode1=new HeroNode(1,"宋江","及时雨"); HeroNode heroNode2=new HeroNode(2,"林冲","豹子头"); HeroNode heroNode3=new HeroNode(3,"吴用","智多星"); HeroNode heroNode4=new HeroNode(4,"李逵","黑旋风"); linkedListDemo.addHeroNode(heroNode1); linkedListDemo.addHeroNode(heroNode3); linkedListDemo.addHeroNode(heroNode4); linkedListDemo.addNodeByOrder(heroNode2); linkedListDemo.addNodeByOrder(heroNode1); linkedListDemo.addNodeByOrder(heroNode4); linkedListDemo.addNodeByOrder(heroNode3); linkedListDemo.ergodicNode(); } } class HeroNode{ int no;//英雄排名 String name; String nickName; HeroNode next; public HeroNode(int no, String name, String nickName) { this.no = no; this.name = name; this.nickName = nickName; } @Override public String toString() { return "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\'' + '}'; } } //该类用于管理HeroNode节点 class LinkedListDemo{ HeroNode head=new HeroNode(0,"","");//头结点,不需要给任何数据 //添加节点(不论排名,与节点进来就添加到最后) public void addHeroNode(HeroNode heroNode) { //首先需要找到最后一个节点 HeroNode temp=head;//头结点不能动,所以用一个临时变量遍历 while (true) { if(temp.next==null) { break;//说明已经是最后一个结点了 } temp=temp.next;//否则一直向下一个移动 } //找到最后一个节点过后,赋值next temp.next=heroNode; } //添加节点(按照英雄排名添加,如果该英雄已在链表中则提示【已存在,无法添加】) public void addNodeByOrder(HeroNode heroNode) { HeroNode temp=head; boolean flag=false;//用于记录是否有相同节点排名出现 //首先找出heroNode.no在链表中的位置(也就是找到第一次出现heroNode.no小于其他英雄排名的位置) while (true) { if(temp.next==null) {//说明已经是最后一个了 break; } if(temp.next.no>heroNode.no) {//注意这里只能是temp.next.no,而不是temp.no,否则无法添加接点 break; } else if(temp.next.no==heroNode.no) { flag=true; break; } temp=temp.next; } if(flag) { System.out.println("该英雄排名已经出现,不能添加"+"****"+heroNode.no); } else { //注意这里被弄反了,自己想想就知道了 heroNode.next=temp.next; temp.next=heroNode; } } //遍历节点 public void ergodicNode() { //首先判断链表是否为空 if(head.next==null) { throw new RuntimeException("链表为空,无法遍历"); } HeroNode temp=head.next; while (temp!=null) { System.out.println(temp); temp=temp.next; } } }
运行结果:
注意:
1
2这里注意next指向时,赋值被弄反了
思考:
以上代码为什么用以头结点的单链表?