单链表实例(1)实现水浒传排行增删改查和练习
程序员文章站
2022-06-14 22:06:56
实现水浒传排行增删改查对于英雄类,每一个类里都有指向下一个节点的引用public HeroNode next;对于添加根据编号大小,插入对于删除把 要删除的节点的next赋值到被删除的上一个节点的next,即:temp.next == temp.next.next英雄类的定义class HeroNode{public int no;public String name;public String nickname;public HeroNode next;//下一节...
实现水浒传排行增删改查
对于英雄类,每一个类里都有指向下一个节点的引用
public HeroNode next;
对于添加
根据编号大小,插入
对于删除
把 要删除的节点的next赋值到被删除的上一个节点的next,即:
temp.next == temp.next.next
英雄类的定义
class HeroNode {
public int no;
public String name;
public String nickname;
public HeroNode next; //下一节点
public HeroNode(int no,String name,String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
//重写toString
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
头节点
class SingleLinkedList {
//初始化头节点,头节点固定
private HeroNode head = new HeroNode(0,"","");
增加
public void addByOrder(HeroNode heroNode) {
//单链表,插入到添加位置的前一个位置
HeroNode temp = head;
boolean flag = false;//标志添加的编号是否存在,默认为false,不存在
while(true) {
if(temp.next == null) {
//若temp链表在最后
break;
}
if(temp.next.no>heroNode.no) {
//如果temp的下一个位置的编号,符合,添加进去
break;
}
if(temp.next.no == heroNode.no) {
//重复了编号
flag = true; //说明编号存在
break;
}
temp = temp.next;
}
//退出循环后,判断flag的值
if(flag) {
System.out.printf("准备插入的英雄编号%d,已经存在\n",heroNode.no);
}
else {
//插入进去
heroNode.next = temp.next;
temp.next = heroNode;
}
}
修改
//修改,根据编号来修改,no编号不能修改
public void update(HeroNode newHeroNode) {
//判断是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
//flag 标识
boolean flag = false;
while(true) {
if(temp == null) {
break;
}
if(temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
}else {
System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
}
}
删除
//修改,根据编号来修改,no编号不能修改
public void update(HeroNode newHeroNode) {
//判断是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
//flag 标识
boolean flag = false;
while(true) {
if(temp == null) {
break;
}
if(temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
}else {
System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
}
}
显示
public void list() {
//判断链表是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
//创建辅助变量进行遍历
HeroNode temp = head.next;
while(true) {
//输出节点信息
System.out.println(temp);
if(temp.next == null) {
break;
}
temp = temp.next;
}
}
练习1、查询倒数第K个节点
public HeroNode get_K_Node(int k) {
HeroNode temp = head.next;
int length = 0;
while(temp!=null) {
length++;
temp = temp.next;
}
if(k>length || k<0) {
System.out.println("节点超出范围");
return null;
}
else {
HeroNode cus = head.next;
System.out.println(cus+"---");
for(int i=0;i<length-k;i++) {
cus = cus.next;
System.out.println(cus+"---");
}
return cus;
}
}
练习2、单链表的反转
public void mirrorHeroNode() {
HeroNode temp = head.next;
HeroNode mirrorNode = new HeroNode(0,"","");//新节点头
HeroNode mirror = null; //记录遍历节点的下一个节点,放在链表丢失
while(temp !=null) {
mirror = temp.next; //记录遍历节点的下一个节点
temp.next = mirrorNode.next;//将新节点头的下一个元素指向 要插入 的节点的下一个
mirrorNode.next = temp; //然后把要插入的节点加入到新节点的下一个
temp = mirror; //让temp移动一位
}
while(mirrorNode.next!=null) {
System.out.println(mirrorNode.next);
mirrorNode.next = mirrorNode.next.next;
}
}
完整代码
package com.atguigu.linkedlist;
public class SingleLinkList {
public static void main(String[] args) {
HeroNode hero1 = new HeroNode(1,"松江","及时雨");
HeroNode hero2 = new HeroNode(2,"吴用","智多星");
HeroNode hero3 = new HeroNode(3,"卢俊义","玉麒麟");
HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
SingleLinkedList list= new SingleLinkedList();
/*
*list.add(hero1);
*list.add(hero2);
*list.add(hero3);
*list.add(hero4);
*/
list.addByOrder(hero1);
list.addByOrder(hero4);
list.addByOrder(hero2);
list.addByOrder(hero3);
list.addByOrder(hero3);
list.list();
System.out.println("");
//HeroNode hero5 = new HeroNode(4,"林冲","豹子头==");
//list.update(hero5);
list.delete(4);
list.list();
}
}
//定义SingleLinkList
class SingleLinkedList {
//初始化头节点,头节点固定
private HeroNode head = new HeroNode(0,"","");
//添加节点
public void add(HeroNode heroNode) {
//不考虑编号顺序时,找到最后节点,将next指向新节点
//temp指向头节点
HeroNode temp = head;
//遍历链表
while(true) {
//当next == null ,即为尾节点
if(temp.next == null) {
break;
}
//指向下一个节点
temp = temp.next;
}
//经过while循环,temp遍历到尾节点
temp.next = heroNode;
}
//第二种添加的方法,根据编号大小
public void addByOrder(HeroNode heroNode) {
//单链表,插入到添加位置的前一个位置
HeroNode temp = head;
boolean flag = false;//标志添加的编号是否存在,默认为false,不存在
while(true) {
if(temp.next == null) {
//若temp链表在最后
break;
}
if(temp.next.no>heroNode.no) {
//如果temp的下一个位置的编号,符合,添加进去
break;
}
if(temp.next.no == heroNode.no) {
//重复了编号
flag = true; //说明编号存在
break;
}
temp = temp.next;
}
//退出循环后,判断flag的值
if(flag) {
System.out.printf("准备插入的英雄编号%d,已经存在\n",heroNode.no);
}
else {
//插入进去
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//修改,根据编号来修改,no编号不能修改
public void update(HeroNode newHeroNode) {
//判断是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
//flag 标识
boolean flag = false;
while(true) {
if(temp == null) {
break;
}
if(temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = newHeroNode.name;
temp.nickname = newHeroNode.nickname;
}else {
System.out.printf("没有找到%d的节点,不能修改\n",newHeroNode.no);
}
}
//删除
public void delete(int no) {
HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.no == no) {
temp.next = temp.next.next;
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("删除成功");
}
else {
System.out.println("未找到元素");
}
}
//显示
public void list() {
//判断链表是否为空
if(head.next == null) {
System.out.println("链表为空");
return;
}
//创建辅助变量进行遍历
HeroNode temp = head.next;
while(true) {
//输出节点信息
System.out.println(temp);
if(temp.next == null) {
break;
}
temp = temp.next;
}
}
}
class HeroNode {
public int no;
public String name;
public String nickname;
public HeroNode next; //下一节点
public HeroNode(int no,String name,String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
//重写toString
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
}
}
本文地址:https://blog.csdn.net/weixin_43628058/article/details/107373237