1、根据一定的规则进行插入结点
2、对结点进行搜索,修改
3、对结点进行删除,查找
import java.util.Scanner;
/*
按顺序进行插入链表
*/
public class LinkDemo2 {
public static void main(String[] args) {
SingleLinkedList2 l = new SingleLinkedList2();
Scanner scanner = new Scanner(System.in);
HeroNode2 h1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 h2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 h3 = new HeroNode2(3, "吴用", "智多星");
HeroNode2 h4 = new HeroNode2(4, "林冲", "豹子头");
try {
l.addByOrder(h2);
l.addByOrder(h3);
l.addByOrder(h4);
l.addByOrder(h1);
// 检查链表
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
System.out.println("原始链表结果为:");
l.list();
int id = 0;
while (true) {
System.out.println("是否需要进行修改?y or n");
String key = scanner.next();
if ("y".equals(key)) {
System.out.println("请输入需要改的id号:");
id = scanner.nextInt();
if (id == -1) {
break;
}
System.out.println("请输入需要改的名字:");
String name = scanner.next();
System.out.println("请输入需要改的称号:");
String nickname = scanner.next();
l.replaceInfo(id, name, nickname, l);
System.out.println("修改后链表的结果为:");
l.list();
} else {
// System.exit(0);
break;
}
}
l.delectNode(h3);
l.delectNode(h1);
l.delectNode(h1);
l.delectNode(h4);
l.list();
}
}
class SingleLinkedList2 {
// 初始化一个头节点,头节点不要动,不存放任何的数据
private HeroNode2 head = new HeroNode2(0, "", "");
// 尾插法
public void add(HeroNode2 heroNode) {
// 辅助变量
HeroNode2 temp = head;
// 遍历,直到最后尾部
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = heroNode;
}
// 按顺序添加英雄,根据排名插入到指定的位置(如果有这个排名,则添加失败,并给出提示)
public void addByOrder(HeroNode2 heroNode2) {
HeroNode2 temp = head; // 指向头节点
boolean flag = false;
while (true) {
if (temp.next == null) {
// temp.next = heroNode2;
break;
} else {
if (temp.next.no > heroNode2.no) {
// heroNode2.next = temp.next;
// temp.next = heroNode2;
break;
} else if (temp.next.no == heroNode2.no) {
flag = true;
} else if (heroNode2.no > 108) {
throw new RuntimeException("添加的英雄序号为:" + heroNode2.no + ",英雄序号不该大于108");
}
temp = temp.next;
}
}
if (flag) {
System.out.println("序号:" + heroNode2.no + ",英雄编号已存在,无法添加");
} else {
heroNode2.next = temp.next;
temp.next = heroNode2;
}
}
// 修改链表的内容
public void replaceInfo(int id, String name, String nickname, SingleLinkedList2 s) {
HeroNode2 temp = head;
if (s.isEmpty()) {
System.out.println("链表为空,无法执行操作");
return;
}
// 寻找有效的id号
while (temp != null && id != temp.no ) {
temp = temp.next;
}
if (temp == null) {
System.out.println("无法找到有效的id号");
return; // 终止操作
} else {
// 如果找到,进行修改
if (!("0".equals(name))) {
temp.name = name;
}
if (!("0".equals(nickname))) {
temp.nickname = nickname;
}
}
}
// 删除结点
public void delectNode(HeroNode2 heroNode2){
HeroNode2 temp = head;
boolean flag = false;
if(temp.next ==null){
System.out.println("空链表");
return;
}
while(true){
if(temp.next == null){ // 找到最后也没找到编号
break;
}
if(temp.next.no == heroNode2.no){ // 找到了编号的前一个
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.next = temp.next.next;
}else{
System.out.println("序号为:"+heroNode2.no+"的节点不存在或者已被删除掉了,链表中无法没找到相应的结点");
}
}
// 判断链表是否为空
public boolean isEmpty() {
HeroNode2 temp = head;
return (temp.next) == null;
}
// 显示链表[遍历]
public void list() {
HeroNode2 temp = head;
if ((temp.next) == null) {
System.out.println("空链表");
return;
}
while (temp.next != null) {
temp = temp.next;
System.out.println(temp.toString());// 输出结点中的信息
}
}
}
// 英雄类的结点
class HeroNode2 {
public int no;// 编号
public String name;// 名字
public String nickname; // 称号
public HeroNode2 next; // 下一个结点
public HeroNode2(int n, String name, String nickname) {
this.no = n;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "heroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
该代码示例展示了如何在Java中使用单链表数据结构进行操作,包括按顺序插入结点、搜索并修改结点信息、以及删除结点。程序定义了一个HeroNode类表示结点,包含编号、名字和称号属性,以及一个SingleLinkedList2类来管理链表,提供了添加、按顺序添加、替换信息、删除结点和遍历链表的方法。
1551

被折叠的 条评论
为什么被折叠?



