定义节点类:节点类包含每个节点存储的信息和构造器
这里要注意的是用toString()方法打印输出时对next打印输出的理解
class HeroNode{//每个节点代表一个英雄,存储着英雄信息
public int no;
public String name;
private String nickname;
public HeroNode next;//指向下一个节点
//构造器
public HeroNode(int no,String name,String nickname){
this.name=name;
this.nickname= nickname;
this.no=no;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';//注意next也是一个节点,会打印出temp之后的所有节点的信息,如上面sout(temp)和这里sout(next)都是打印出节点信息
}
}
定义单链表类步骤:初始化头节点,有序插入,无序插入,显示链表,修改节点信息(注意修改的信息不能是编号no,因为这里我们把编号作为节点地址域,修改了编号就相当于添加了节点),删除节点
初始化头节点,有序插入,无序插入
private HeroNode head=new HeroNode(0,"","");
public void addNode(HeroNode newnode){
//不考虑节点编号顺序
HeroNode temp=head;
boolean flag=true;
while(flag){
if(temp.next==null){//找到了链表的最后一个节点
temp.next=newnode;
flag=false;
}
temp=temp.next;
}
}
public void addByOrder(HeroNode newnode){
HeroNode temp=head;
// boolean flag=true;
while (true){
if(temp.next.no>newnode.no){
//说明找到了newnode应该放置的位置
newnode.next= temp.next;
temp.next=newnode;
break;
}
temp=temp.next;
}
}
修改节点信息
public void alterNode(String newname,int no){
HeroNode temp=head.next;
while(true){
if (temp==null){
System.out.println("链表为空!!");
break;
}
if(temp.no==no){
temp.name=newname;
break;
}
temp=temp.next;
//找不到编号为no的节点
if(temp.next==null){
System.out.println("未找到要修改的节点!!");
break;
}
}
}
删除节点
//删除节点
public void delNode(int no){
HeroNode temp=head;
while(true){
if (temp.next==null){
System.out.println("链表为空!!");
break;
}
if(temp.next.no==no){
temp.next=temp.next.next;
break;
}
temp=temp.next;
//找不到编号为no的节点
if(temp.next==null){
System.out.println("未找到要删除的节点!!");
break;
}
}
}
显示链表也要借助辅助节点temp,遍历终止条件是temp.next==null
public void showNodes(){
if(head.next==null){
System.out.println("链表为空!!");
}
//打印所有节点
HeroNode temp=head.next;//细节注意!不要打印出head节点
boolean flag=true;
while (flag){
if(temp.next==null){ //temp和next都是节点
flag=false;
}
System.out.println(temp);//没有必要temp.toString()了!!
temp=temp.next;//后移
}
}
测试有序插入,无序插入,修改,删除和展示操作是否正确
HeroNode node1=new HeroNode(1,"宋江","及时雨");
HeroNode node2=new HeroNode(2,"林冲","豹子头");
HeroNode node3=new HeroNode(3,"卢俊义","玉麒麟");
HeroNode node4=new HeroNode(4,"啊明","诸葛亮");
HeroNode node5=new HeroNode(5,"吴用","智多星");
//创建一个空链表
LinkList linkList=new LinkList();
//向链表添加元素
linkList.addNode(node1);
linkList.addNode(node2);
linkList.addNode(node3);
linkList.addNode(node5);
linkList.addByOrder(node4);
//展示链表
linkList.showNodes();
//测试。 修改编号为4的节点的名字为孔明
System.out.println("==========修改后展示=========");
linkList.alterNode("孔明",4);
linkList.showNodes();
//测试,删除编号no=4的节点
System.out.println("==========删除编号no=4的节点=========");
linkList.delNode(4);
linkList.showNodes();
运行结果:
代码汇总:
package LinkList;
public class SingleLinkList {
public static void main(String[] args) {
HeroNode node1=new HeroNode(1,"宋江","及时雨");
HeroNode node2=new HeroNode(2,"林冲","豹子头");
HeroNode node3=new HeroNode(3,"卢俊义","玉麒麟");
HeroNode node4=new HeroNode(4,"啊明","诸葛亮");
HeroNode node5=new HeroNode(5,"吴用","智多星");
//创建一个空链表
LinkList linkList=new LinkList();
//向链表添加元素
linkList.addNode(node1);
linkList.addNode(node2);
linkList.addNode(node3);
linkList.addNode(node5);
linkList.addByOrder(node4);
//展示链表
linkList.showNodes();
//测试。 修改编号为4的节点的名字为孔明
System.out.println("==========修改后展示=========");
linkList.alterNode("孔明",4);
linkList.showNodes();
//测试,删除编号no=4的节点
System.out.println("==========删除编号no=4的节点=========");
linkList.delNode(4);
linkList.showNodes();
}
}
class LinkList{
private HeroNode head=new HeroNode(0,"","");
public void addNode(HeroNode newnode){
//不考虑节点编号顺序
HeroNode temp=head;
boolean flag=true;
while(flag){
if(temp.next==null){//找到了链表的最后一个节点
temp.next=newnode;
flag=false;
}
temp=temp.next;
}
}
public void addByOrder(HeroNode newnode){
HeroNode temp=head;
// boolean flag=true;
while (true){
if(temp.next.no>newnode.no){
//说明找到了newnode应该放置的位置
newnode.next= temp.next;
temp.next=newnode;
break;
}
temp=temp.next;
}
}
public void alterNode(String newname,int no){
HeroNode temp=head.next;
while(true){
if (temp==null){
System.out.println("链表为空!!");
break;
}
if(temp.no==no){
temp.name=newname;
break;
}
temp=temp.next;
//找不到编号为no的节点
if(temp.next==null){
System.out.println("未找到要修改的节点!!");
break;
}
}
}
//
public void delNode(int no){
HeroNode temp=head;
while(true){
if (temp.next==null){
System.out.println("链表为空!!");
break;
}
if(temp.next.no==no){
temp.next=temp.next.next;
}
temp=temp.next;
//找不到编号为no的节点
if(temp.next==null){
System.out.println("未找到要删除的节点!!");
break;
}
}
}
public void showNodes(){
if(head.next==null){
System.out.println("链表为空!!");
}
//打印所有节点
HeroNode temp=head.next;//细节注意!不要打印出head节点
boolean flag=true;
while (flag){
if(temp.next==null){ //temp和next都是节点
flag=false;
}
System.out.println(temp);//没有必要temp.toString()了!!
temp=temp.next;//后移
}
}
}
class HeroNode{//每个节点代表一个英雄,存储着英雄信息
public int no;
public String name;
private String nickname;
public HeroNode next;//指向下一个节点
//构造器
public HeroNode(int no,String name,String nickname){
this.name=name;
this.nickname= nickname;
this.no=no;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';//注意next也是一个节点,会打印出temp之后的所有节点的信息,如上面sout(temp)和这里sout(next)都是打印出节点信息
}
}
细节说明:
删除节点后,被从链表删除的节点不再被指向,会被垃圾回收机制回收释放空间!!
next和temp一样都是节点即都为一个域,可做下面测试加深理解
1.通过toString()方法打印出来next的运行结果:
2.通过toString()方法打印出来不含next的运行结果:
=========今日打卡单链表=========