【算法03】单链表

1、何为单链表?

以节点方式进行存储的有序列表。每个节点包含:data域(存储数据的值)、next域(指向下一节点)。在内存中,链表通过next域相互连接,所以链表中的各个节点不一定依次排列存储在内存中。

链表分为带头节点和不带头节点的链表,根据具体情况选择使用。

链表较数组而言更灵活,可以动态管理数据。

 2、单链表添加数据

public class singlelianbiao {
    public static void main(String[] args) {
        //定义四个节点,进行测试
        Jiedian jiedian1 = new Jiedian(1,"宋江","及时雨");
        Jiedian jiedian2 = new Jiedian(2,"卢俊义","玉麒麟");
        Jiedian jiedian3 = new Jiedian(3,"吴用","智多星");
        Jiedian jiedian4 = new Jiedian(4,"林冲","豹子头");
        //创建链表
        singlelinkedlist sl = new singlelinkedlist();
        //向链表中按照方式一添加节点
//        sl.add1(jiedian1);
//        sl.add1(jiedian2);
//        sl.add1(jiedian3);
//        sl.add1(jiedian4);
        //向链表中按照方式二添加节点
        sl.add2(jiedian1);
        sl.add2(jiedian4);
        sl.add2(jiedian3);
        sl.add2(jiedian2);
        System.out.println("链表为:");
        sl.show();
//        System.out.println("进行链表某节点的修改:");
//        sl.update(newjiedian);
//        System.out.println("修改后的链表为:");
//        sl.show();
        sl.delete(2);
        sl.delete(2);
        sl.delete(4);
        System.out.println("删除节点后的链表为:");
        sl.show();
    }
}
//定义节点
class Jiedian {
    public int number;//序号
    public String name;//名称
    public String anothername;//别名
    public Jiedian next;//next指针,在此处为“等待赋值状态”,所有值都为null

    //重写toString方法。
    //注意:若toString方法中加上了next,就会一层一层的往下找完再输出全部的。所以在这里不需要添加next
    @Override
    public String toString() {
        return "Jiedian{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", anothername='" + anothername + '\'' +
                '}';
    }
    //定义构造函数
    public Jiedian(int number, String name, String anothername) {
        this.number = number;
        this.name = name;
        this.anothername = anothername;
        next = null;
    }
}
//定义单链表,管理数据
class singlelinkedlist{
    //定义头节点
    private Jiedian head = new Jiedian(0,"","");
    //第一种添加的方式:向单链表中依次添加结点,来一个就添加到链表尾部
    public void add1(Jiedian jiedian){
        Jiedian temp = head;//定义一个移动指针,先让他指向头节点
        while(true){
            if(temp.next == null){
                temp.next = jiedian;
                break;
            }
            temp = temp.next;
        }
    }
    //第二种添加的方式:找到节点应在的位置,再将节点添加进去
    public void add2(Jiedian jiedian){
        Jiedian temp = head;//定义一个移动指针,先让他指向头节点
        while(true){
            if(jiedian.number == temp.number){
                System.out.println("链表中已存在编号为" + jiedian.number + "的数据,请勿重复添加!");
                break;
            }
            if(temp.next == null){
                //链表为空,可以直接将数据添加进去
                temp.next = jiedian;
                break;
            }
            if(temp.next.number > jiedian.number){
                //此时找到了此节点可以加入的位置
                jiedian.next = temp.next;
                temp.next = jiedian;
                break;
            }
            temp = temp.next;//以上if条件都不满足
        }
    }
    //修改节点
    public void update(Jiedian jd){
        Jiedian temp = head;
        while(true){
            if(temp.next == null){
                System.out.println("链表中无此相关节点!");
                break;
            }
            if(jd.number == temp.number){
                temp.anothername = jd.anothername;
                temp.name = jd.name;
                System.out.println("修改成功!");
                break;
            }
            temp = temp.next;
        }
    }
    //删除节点
    //若要传入一个节点,一定要牢记此节点并不在链表中,他的next是null而非链表中的下一个,所以不能写节点.next!!错大发咯
    public void delete(int number){
        Jiedian temp = head;
        while(true){
            if(temp.next == null){
                System.out.println("链表中无此节点!");
                break;
            }
            //此处一定要让temp指针移动到需要删除节点的前一个节点的位置,不然删除时无法找到此节点,就无法进行删除操作
            if(temp.next.number == number){
                temp.next = temp.next.next;
                System.out.println("删除成功!");
                break;
            }
            temp = temp.next;
        }
    }
    //显示链表(遍历)
    public void show(){
        //先判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空!");
            return;
        }
        Jiedian temp = head.next;//定义一个移动指针
        //使用temp != null保证了最后一个节点也可以被输出
        while(temp != null){
            System.out.println(temp);
            temp = temp.next;
        }
    }
}

总结

1>return、break、continue的区别:

return:不是专门用于跳出循环的,而是去结束一个方法。一旦执行到一个return语句,则此方法将直接结束。

break:跳出当前循环,不再进行循环,即:完全终止循环。

continue:结束这一次的循环,转而去执行下一次循环,即:中止本次循环。

猜你喜欢

转载自blog.csdn.net/qq_59942266/article/details/127391036