目录
/**
* 单链表的使用,
* 游戏英雄排行榜
* 功能:增删改查
* 缺陷:删改功能对不按顺序编辑的链表无用
*
* 题1:求单链表中有效节点的个数
* 题2:查看倒数第k个节点
*/
//主函数
public class Main {
public static void main(String[] args) {
//创建节点
Hero h1 = new Hero(1, "貂蝉", "女");
Hero h2 = new Hero(2, "王昭君", "女");
Hero h3 = new Hero(3, "狂铁", "男");
Hero h4 = new Hero(4, "马可波罗", "男");
//创建链表
SingleLinked s = new SingleLinked();
s.addHero(h2);
s.addHero(h3);
s.addHero(h4);
s.addHero(h1);
//方法使用
System.out.println("未排序————————————————————");
s.show();
SingleLinked s2 = new SingleLinked();
s2.addByOrder(h2);
s2.addByOrder(h3);
s2.addByOrder(h4);
s2.addByOrder(h1);
System.out.println("已排序————————————————————");
s2.show();
Hero h5 = new Hero(4, "鲁班", "男");
s2.Alter(h4, h5);
System.out.println("信息修改————————————————————");
s2.show();
System.out.println("删除————————————————————");
s2.Del(3);
s2.show();
System.out.println("t1:s2的链表长为"+s2.Count());
System.out.println("t1:s2的倒数第3个为"+s2.Find(3));
}
}
// 节点类
class Hero {
// 节点信息
public String name;
public int no;
public String sex;
public Hero next; // 节点的指向下一个
public Hero(int no, String name, String sex) {
this.name = name;
this.no = no;
this.sex = sex;
}
@Override
public String toString() {
return "Hero [no=" + no + ",name=" + name + ", sex=" + sex + "]";
}
}
// 链表类
class SingleLinked {
private Hero head = new Hero(0, "", "");//头结点
/**
* 显示
* 建立Hero的节点变量,通过变量遍历全链表
*/
public void show() {
if (isEmpty()) {
System.out.println("空链表");
return;
}
Hero node=head;//移动的节点变量
while (true) {
node = node.next;
if (node == null) {
break;
}
System.out.println(node);
}
}
public Boolean isEmpty() {
return head.next == null;
}
/**
* 不考虑编号顺序的添加
* 建立Hero的节点变量,通过变量将数据加入链表
* 初始node=head(从链表头开始往后一个结点添加数据)
*
* @param h
*/
public void addHero(Hero hero) {
Hero node=head;//移动的节点变量
while (true) {
if (node.next == null) {
break;
}
node = node.next;
}
node.next = hero;
}
/**
* 排序的加入
* 节点:node 初始=head
* 加入时判断该节点是否已经存在,若不存在就添加到比它大的节点之前
*/
public void addByOrder(Hero hero) {
Hero node=head;//移动的节点变量
boolean flag = false; // 是否重复标识符
if (isEmpty()) {
System.out.println("空链表");
}
while (true) {
if (node.next == null) {
break;
}
if (node.next.no == hero.no) {
flag = true;
break;
} else if (node.next.no > hero.no) {
break;
}
node = node.next;
}
if (flag) {
System.out.println("编号" + hero.no + "重复");
} else {
hero.next = node.next;
node.next = hero;
}
}
/**
* 通过编号修改节点信息
*
* @param hero 原节点
* @param newh 新节点
*/
public void Alter(Hero hero, Hero newh) {
if (isEmpty()) {
System.out.println("空链表");
return;
}
Hero node=head;//移动的节点变量
boolean flag = false; // 编号是否存在标识符
while (true) {
node = node.next;
if (node.next == null) {
System.out.println("结束");
break;
} else if (node.next.no == hero.no) {
flag = true;
break;
}
}
if (flag) {
// node.next.no==hero.no
node.next.name = newh.name;
node.next.sex = newh.sex;
} else {
System.out.println("没有该编号");
}
}
/**
* 删除某节点
* @param no
*/
public void Del(int no) {
Hero node=head;//移动的节点变量
boolean flag = false; // 编号是否存在标识符
if (isEmpty()) {
System.out.println("空链表");
return;
}
while (true) {
node = node.next;
if (node == null) {
System.out.println("结束,没有该编号");
break;
} else if (node.next.no == no) {
flag = true;
break;
}
}
if (flag) {
node.next = node.next.next;
}
}
// 题1:求单链表中有效节点的个数
public int Count(){
Hero node=head;//移动的节点变量
if(isEmpty()){
System.out.println("空");
return 0;
}
int count=0;
while (true) {
if(node.next!=null){
count+=1;
}else{
break;
}
node=node.next;
}
return count;
}
//题2:查看倒数第k个节点
public Hero Find(int k){
Hero node=head;//移动的节点变量
int count=Count();
if(isEmpty()){
System.out.println("空");
return null;
}
if(k<=0&&k>count){
System.out.println("k不存在");
return null;
}
for (int i = 0; i <=count-k; i++) {
node=node.next;
}
return node;
}
}
学习适配:B站尚硅谷公开视频
全部代码根据本人编码情况结合视频中的代码改写