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.remove(heroNode1);
// linkedListDemo.remove(heroNode4);
// linkedListDemo.update(new Heronode(2,"林冲","禁军教头"));
// System.out.println(linkedListDemo.size());
// System.out.println("*************");
// System.out.println( linkedListDemo.findK(1));
// System.out.println("*************");
System.out.println("翻转前:");
linkedListDemo.ergodicNode();
linkedListDemo.reverse();
System.out.println("翻转后:");
linkedListDemo.ergodicNode();
}
}
class HeroNode{
int no;//英雄排名
String name;
String nickName;
Heronode next;
public Heronode() {
}
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;
}
}
//删除节点(根据英雄排名no)
public void remove(Heronode heroNode) {
Heronode temp=head;
//判断一下链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空");
}
while (true) {
if(temp.next.no==heroNode.no) {
temp.next=heroNode.next;
System.out.println("删除成功");
break;
}
if(temp.next==null) {
throw new RuntimeException("该节点不存在");
}
temp=temp.next;
}
}
//修改节点信息
public void update(Heronode newheroNode) {
//判断一下链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空");
}
Heronode temp=head.next;
while (true) {
if(temp.no==newheroNode.no) {
temp.name=newheroNode.name;
temp.nickName=newheroNode.nickName;
break;
}
if(temp==null) {
throw new RuntimeException("该节点在链表中不存在");
}
temp=temp.next;
}
}
//遍历节点
public void ergodicNode() {
//首先判断链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空,无法遍历");
}
Heronode temp=head.next;
while (temp!=null) {
System.out.println(temp);
temp=temp.next;
}
}
//获取节点长度(不包括头结点)
public int size() {
int count=0;
//首先判断链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空");
}
Heronode temp=head.next;
while (temp!=null) {
count++;
temp=temp.next;
}
return count;
}
//找出单链表中的倒数第k个节点(不包括头节点)
public Heronode findK(int k) {
//首先判断链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空");
}
if((size()-k+1)<1||(size()-k+1)>size()) {
throw new RuntimeException("不存在在链表中,"+k);
}
Heronode temp=head;
for(int i=1;i<=size()-k+1;i++) {
temp=temp.next;
}
return temp;
}
//翻转链表(原来链表结构发生改变)----头插法
public void reverse() {
//首先判断链表是否为空或者链表只有一个节点
if(head.next==null||head.next.next==null) {
return;
}
//定义一个用于移动(遍历)节点的变量
Heronode cur=head.next;
//定义一个临时变量用于保存cur。next的节点
Heronode next=null;
Heronode newHead=new Heronode();//新的头结点
while (cur!=null) {
next=cur.next;
//头插法,插入开始
cur.next=newHead.next;
newHead.next=cur;
//插入结束
//移动指针cur
cur=next;
}
head.next=newHead.next;
}
//逆序输出链表(Stack)***不破坏原来链表的结构
public void reversePrint() {
//首先判断链表是否为空
if(head.next==null) {
throw new RuntimeException("链表为空");
}
Stack stack = new Stack<>();
Heronode temp=head.next;
while (temp!=null) {
stack.push(temp);
}
while (stack.size()>0) {
System.out.println(stack.pop());
}
}
}