数据结构-单链表实现

单链表的头没有存储信息,仅作为一个记号;
单链表有一个next指针,指向下一个节点;
可以在除头节点外的任何节点进行增删改查,但是在链表头部操作和在尾部操作所消耗的资源是大不相同的。

package com.base;


class singleLinkedList {
    //test
    public static void main(String[] args) {
        node node1 = new node(1, "zhangsan", "男");
        node node2 = new node(2, "lisi", "女");
        node node3 = new node(3, "wangwu", "男");
        node node4 = new node(3,"zhaoliu","女");

        singleLinkedList singleLinkedList = new singleLinkedList();

        singleLinkedList.addByOrder(node1);
        singleLinkedList.addByOrder(node3);
        singleLinkedList.addByOrder(node2);
        System.out.println("显示链表:");
        singleLinkedList.listAll();
        singleLinkedList.updateNode(node4);

        System.out.println("更新节点后的链表为:");
        singleLinkedList.listAll();
        System.out.println("===================");
        singleLinkedList.findNodeByName("zhaoliu");

    }

    // 初始化一个头节点,不存放数据
    private node head = new node(0, "", "");

    // 添加节点
    public void addNode(node node) {
        // 需要临时节点
        node temp = head;
        // 遍历链表,找到链表最后一个节点
        while (true) {
            // 找到了最后一个
            if (temp.next == null)
                break;
            ;
            // 如果没找到,则后移temp直至找到最后一个
            temp = temp.next;
        }
        // 当退出while循环时一定找到了最后一个节点,那么将传入的节点放入到最后即可
        temp.next = node;
    }

    public void addByOrder(node node) {
        node temp = head;
        boolean flag = false;
        while (true) {
            // 如果temp是最后一个元素,则直接在后面添加即可
            if (temp.next == null) {
                break;
            }
            // temp的下一个节点的no值如果大于传入的节点的no,那么就在temp的后面插入
            if (temp.next.no > node.no) {
                break;
            } else if (temp.next.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println("编号已存在");
        }else {
           node.next =  temp.next;
           temp.next = node;
        }
    }

    // 删除节点
    public void delNode(node node){
        node temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.no == node.no){
                flag =true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
          temp.next = temp.next.next;
        }else System.out.println("无可删除节点");
    }

    // 修改节点
    public void updateNode(node node){
        node temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.no == node.no){
                flag =true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.next.name = node.name;
            temp.next.gender = node.gender;
        }else addByOrder(node);
    }

    // 查找节点
    public void findNodeByName(String name){
        node temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.name == name){
                flag =true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            System.out.println(temp.next);
        }else System.out.println("没有找到叫"+name+"的人");;
    }

    // 显示链表
    public void listAll() {
        // 如果链表为空则退出
        if (head.next == null) {
            System.out.println("链表为空~~~");
            return;
        }
        node temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }
}

class node {
    public int no;
    public String name;
    public String gender;
    public node next;

    public node(int no, String name, String gender) {
        this.no = no;
        this.name = name;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "node{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值