//链表
class linkedList {
private Hero head = new Hero(0, "");
//直接添加到链表尾部
public void add(Hero hero) {
//头节点不可以变化,所以借助临时节点
Hero temp = head;
//找到最后一个节点
while (temp.getNext() != null) {
temp = temp.getNext();
}
//设置最后一个节点的后一个节点
temp.setNext(hero);
}
//按照英雄的编号排列
public void addByOrderNo(Hero hero) {
Hero temp = head;
//查看传入的英雄是否存在
boolean flag = false; //默认不存在
while (true) {
if (temp.getNext() == null) {
//说明到最后一个了,直接在最后添加
break;
}
if (temp.getNext().getNo() > hero.getNo()) {
//下一个的no大于当前传入的no,所以放在temp和temp.next之间
break;
}
if (temp.getNext().getNo() == hero.getNo()) {
//相等说明,当前英雄已存在
flag = true;
break;
}
temp = temp.getNext();
}
//判断是否存在
if (flag) {
//存在
System.out.printf("当前英雄已存在,英雄id为:" + hero.getNo());
} else {
//不存在
//将temp的next赋值给hero的next
hero.setNext(temp.getNext());
//将hero赋值给temp的next
temp.setNext(hero);
}
}
public Hero getHead() {
return head;
}
public void print() {
if (head.getNext() == null) {
System.out.println("没有内容~");
return;
}
Hero temp = head;
while (true) {
temp = temp.getNext();
System.out.println(temp);
if (temp.getNext() == null) {
return;
}
}
}
}
//节点
class Hero {
//英雄编号
private int no;
//姓名
private String name;
//指向的下一个英雄
private Hero next;
public Hero(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Hero{" +
"no=" + no +
", name='" + name + ''' +
'}';
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Hero getNext() {
return next;
}
public void setNext(Hero next) {
this.next = next;
}
}
反转单向链表
思路:
- 定义一个零时头指针
- 依次从链表中取出一个节点,放在临时头指针的后面
public static void reverselinkedList(Hero head) {
//若链表只有一个或零个则直接返回
if (head.getNext() == null || head.getNext().getNext() == null) {
return;
}
//临时头部,表示反转之后的头部
Hero tempHead = new Hero(0, "");
Hero first = head.getNext();
Hero next = null; //第一个的后一个
while (first != null) {
//保留下一个英雄
next = first.getNext();
//修改要放入反转链表的next属性为原来反转链表的第一个英雄
first.setNext(tempHead.getNext());
//修改反转链表头中的next属性
tempHead.setNext(first);
//指向下一个英雄
first = next;
}
//修改头
//head = tempHead;(x) 只是将地址给了head,内容没有发生改变
head.setNext(tempHead.getNext());
}
倒序打印链表(使用栈)
public static void reversePrint(Hero head) {
if (head.getNext() == null) {
System.out.println("链表为空");
return;
}
Stack stack = new Stack<>();
Hero temp = head.getNext();
//入栈
while (temp != null) {
stack.push(temp);
temp = temp.getNext();
}
//出栈
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
从B站韩顺平老师的Java数据结构与算法习得。



