/*
按序号添加
1,首先找到temp新添加的节点位置的前一个,是通过辅助变量(指针),通过遍历来搞定
2,新节点.next=temp.next
2 temp.next=新节点
*/
public class SingleLunkedListDemo {
public static void main(String[] args) {
//测试
//创建节点
// 每一个HeroNode对象就是一个节点
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
//创建链表
SingleLunkedList singleLunkedList = new SingleLunkedList();
当不考虑编号顺序时这么添加
// singleLunkedList.add(heroNode1);
// singleLunkedList.add(heroNode2);
// singleLunkedList.add(heroNode3);
// singleLunkedList.add(heroNode4);
//按编号顺序添加在内存中就可节省时间
singleLunkedList.addByorder(heroNode1);
singleLunkedList.addByorder(heroNode3);
singleLunkedList.addByorder(heroNode2);
singleLunkedList.addByorder(heroNode4);
// singleLunkedList.addByorder(heroNode4);
//显示
singleLunkedList.list();
//测试修改节点信息不能修改编号
//首先先创建一个节点(也就是你要修改成哪样),编号是你要修改的哪个节点的编号
HeroNode newherenode = new HeroNode(2, "小卢", "玉麒麟~~");
singleLunkedList.update(newherenode);
System.out.println("修改后显示~~~~~");
//显示
singleLunkedList.list();
//删除节点
singleLunkedList.delectnode(1);
singleLunkedList.delectnode(4);
singleLunkedList.delectnode(3);
singleLunkedList.delectnode(2);
System.out.println("删除后显示");
//显示
singleLunkedList.list();
}
}
//定义SingleLunkedList 管理我们的英雄
class SingleLunkedList{
//先初始化头节点不要动不存放具体数据
private HeroNode head=new HeroNode(0,"","");
//添加节点到单向链表
//思路,当不考虑编号顺序时
//1找到当前最后一个节点
//2将最后一个节点的next指向新的节点
public void add(HeroNode heroNode) {
//头节点不能动所以需要一个辅助变量temp
HeroNode temp=head;
while (true){
//找到链表最后
if (temp.next==null){
break;
}
//如果没有找到就将temp后移
temp=temp.next;
}
//退出while则说明找到链表最后
//将最后这个节点next指向新的节点
temp.next=heroNode;
}
public void addByorder(HeroNode heroNode) {
//头节点不能动所以需要一个辅助变量temp来找添加的位置
//因为是单链表,也因为我们找的是temp是添加位置前面一个节点,否则添加不了
HeroNode temp=head;
boolean flag=false;//用来判断添加的编号是否存在,默认为false好提示
while (true){
if (temp.next==null){//说明找到链表的最后啦不管找没找到都break;
break;
}
if (temp.next.no>heroNode.no){//位置找到了就在temp后面添加 temp.next.no是指原来链表找的temp的后一个节点
//添加的数据位于temp.next.no与temp.no之间
break;
}else if (temp.next.no==heroNode.no){
//说明这个编号已经存在就不可以在添加
//然后循环停止
flag=true;
break;
}
temp=temp.next;//后移,遍历当家链表
}
//先判断flag的值
if (flag){
//说明编号已经存在不可以添加
System.out.println("编号已经存在不可以添加"+heroNode.no);
}else {
heroNode.next=temp.next;
temp.next=heroNode;//heroNode我认为是地址
}
}
//修改节点的信息,根据no编号来修改,no编号不能改
//newhernode 的no 来修改
//newhernode//要修改的节点
public void update(HeroNode newhernode){
//判读是否为空
if (head.next==null){
System.out.println("链表为空");
return;
}
HeroNode temp=head.next;
boolean flag=false;//判读是否找到节点的标记
while (true) {
if (temp==null){
//这里为什么是temp==null勒?因为temp等于空之后就说明已经遍历完了(这里不可能是head节点)
break;//已经遍历完了
}
if (newhernode.no== temp.no){
//找到
flag=true;
break;
}
temp=temp.next;
}
//有两种可能一种是遍历完没找到退出的二是找到了退出的
if (flag){
temp.name= newhernode.name;
temp.nickname= newhernode.nickname;
}else {
//flag==false时说明没找的这个节点
System.out.printf("没有找到这个节点编号 %d 的节点,不能修改",newhernode.no);
}
}
//删除节点的思路
//head节点不能动(temp辅助节点找到待删除的节点的前一个)
//1首先先找到需要删除节点前一个节点temp
//2 temp.next=temp.next.next
//3被删除的节点将不会有其他的引用指向,会被回收机制(jvm)回收
public void delectnode(int no){
HeroNode temp=head;
boolean flag=false;//标记是否找到待节点(上一个)
while (true){
if (temp.next==null){
//已经到链表最后
break;
}
if (temp.next.no==no){
//找到待删除节点的前一个节点啦
flag=true;
break;
}
temp= temp.next;//后移
}
if (flag){
//找到待删除前一个
temp.next=temp.next.next;//这里相当于直接不指向待删除的节点指向待删除节点的下一个(不指向应该会被回收把)
}else {
System.out.printf("没有找到 %d 这个节点",no);
}
}
//显示链表(遍历)
public void list() {
if (head.next==null){
System.out.println("链表为空");
return;
}
//头节点不能动所以需要一个辅助变量temp
HeroNode temp=head;//可以这样写HeroNode temp=head;
while (temp!=null){
System.out.println(temp);
temp=temp.next;//temp后移
}
//遍历也可以这样写
// while (true){
// //判断是否到链表最后
// if (temp==null){
// break;
// }
// System.out.println(temp);
// temp=temp.next;//temp后移
// }
}
}
//定义一个节点(HeroNode),每个HeroNode对象就是一个节点
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+"]";
}
}
这是我看韩顺平老师的课简单的整理的笔记