数据结构与算法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;
    }

    @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();


运行结果:

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

 

代码汇总:

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的运行结果:

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

 

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

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

 

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

你可能感兴趣的:(数据结构与算法,数据结构,链表,java)