[Algorithm 03] Singly linked list

1. What is a singly linked list?

An ordered list stored as nodes. Each node contains: data field (value for storing data), next field (pointing to the next node). In the memory, the linked list is connected to each other through the next field, so each node in the linked list is not necessarily arranged in order and stored in the memory.

The linked list is divided into a linked list with a leading node and a linked list without a leading node, and you can choose to use it according to the specific situation.

Linked lists are more flexible than arrays and can manage data dynamically.

 2. Add data to the singly linked list

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;
        }
    }
}

Summarize

1> The difference between return, break, and continue:

return: Not specifically for jumping out of the loop, but to end a method. Once a return statement is reached, the method will end directly.

break: Jump out of the current loop and no longer loop, that is: completely terminate the loop.

continue: End this cycle, and go to the next cycle, that is: abort this cycle.

Guess you like

Origin blog.csdn.net/qq_59942266/article/details/127391036