单链表

对于数据结构来说,是用来存取数据的。

算法是针对于数据结构的应用,而算法的设计又要以数据结构为载体来进行创建。

想要以单链表来操作数据,最常用的是增删改查。

链表属于线性结构,在逻辑上是相邻的数据结构,但是在物理上有可能又是毫无关系的。

在对链表进行操作的时候,有一个头节点是非常容易来进行操作的。

但是对于添加来说,一定要注意空指针的异常,所以要在进行添加的时候要利用好head头结点。

定义结点

public class PersonNode {
    public Integer id;
    public String personName;
    public PersonNode next;

    public PersonNode(Integer id, String personName, PersonNode next) {
        this.id = id;
        this.personName = personName;
        this.next = next;
    }

    public PersonNode(Integer id, String personName) {
        this.id = id;
        this.personName = personName;
    }

    @Override
    public String toString() {
        return "PersonNode{" +
                "id=" + id +
                ", personName='" + personName + '\'' +
                ", next=" + next +
                '}';
    }
}

定义链表:

public class PersonNodeList {
    private PersonNode head = new PersonNode(-1,null,null);

    public void add(PersonNode node){
        PersonNode temp = head;
        while (true){
            if (temp.next==null){
                break;
            }
            // 因为程序执行到了这里,那么这里temp.next一定不会再试null了,不然就已经终止了
            temp = temp.next;
        }
        temp.next = node;
    }

    public void orderAdd(PersonNode node){
        PersonNode temp = head;
        while (true){
            // 确定终止条件
            // 经过第一步操作之后,表明了链表中已经有数据了
            // 首先确定,到大了最后,也没有发现大于它节点。
            if (temp.next==null){
                break;
            }
            if (temp.next.id == node.id){
                throw new RuntimeException("不能存在着相同的id");
            }
            // 如果当前节点的下一个节点大于,那么需要进行插入
            if (temp.next.id > node.id){
                break;
            }
            // 都不满足,继续循环
            temp = temp.next;
        }
        // 两种情况,第一个节点是空和最后一个节点是空的操作都是一样的
        node.next = temp.next;
        temp.next = node;
    }


    public void show(){
        PersonNode p = head.next;
        if (p==null){
            System.out.println("空链表");
        }
        while (p!=null){
            System.out.println("节点的id是:---->"+p.id+",对应的name是:---"+p.personName);
            p = p.next;
        }
    }

    public void update(PersonNode node){
        PersonNode p = head.next;
        boolean flag = false;
        while (true){
            // 这个是因为没有找到
            if (p==null){
                break;
            }
            // 这个是基于上面来的
            if (p.id == node.id){
                flag = true;
                break;
            }
            p = p.next;
        }
        if (flag){
            p.personName = node.personName;
        }else {
            System.out.println("没有找到对应的节点");
        }
    }

    public void deleteById(Integer id){
        PersonNode t = head;
        boolean flag = false;
        while (true){
            if (t.next==null){
                break;
            }
            if (t.next.id==id){
                flag = true;
                break;
            }

            t=t.next;
        }
        if (flag){
            t.next = t.next.next;
        }else {
            System.out.println("没有找到");
        }
    }
}

对应的操作:

public class PersonListTest {
    public static void main(String[] args) {
        PersonNodeList personNodeList = new PersonNodeList();
        personNodeList.orderAdd(new PersonNode(1,"guang"));
        personNodeList.orderAdd(new PersonNode(3,"meng"));
        personNodeList.orderAdd(new PersonNode(2,"xiang"));
        personNodeList.orderAdd(new PersonNode(17,"xiang"));
        personNodeList.orderAdd(new PersonNode(-9,"xiang"));
        personNodeList.update(new PersonNode(-9,"jiayi"));
        personNodeList.deleteById(-9);
        personNodeList.show();
    }
}

总结:有了头结点之后,操作第一个元素就和操作链表中的元素是一样的效果了。

posted @ 2021-07-19 00:34  雩娄的木子  阅读(56)  评论(0编辑  收藏  举报