> 文章列表 > 数据结构与算法03 定义单链表,单链表的有序和无序的插入,修改和删除数据

数据结构与算法03 定义单链表,单链表的有序和无序的插入,修改和删除数据

数据结构与算法03 定义单链表,单链表的有序和无序的插入,修改和删除数据

带头结点的单链表

定义节点:节点类包含每个节点存储的信息和构造器

这里要注意的是用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;}@Overridepublic 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;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\\'' +", nickname='" + nickname + '\\'' +'}';//注意next也是一个节点,会打印出temp之后的所有节点的信息,如上面sout(temp)和这里sout(next)都是打印出节点信息}
}

细节说明

删除节点后,被从链表删除的节点不再被指向,会被垃圾回收机制回收释放空间!!

next和temp一样都是节点即都为一个域,可做下面测试加深理解

1.通过toString()方法打印出来next的运行结果:

 

2.通过toString()方法打印出来不含next的运行结果:

 

=========今日打卡单链表=========