Java单链表 增删改查等基本功能

部分借鉴了小破站,尚有缺陷。

在这里插入图片描述

public class Node {
    public int id;
    public String name;
    public Node next;   //用于指向下一个节点

    public Node(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return id + "\t" + name;
    }
}

public class LinkListDemo {
    private Node head = new Node(0, "");

    //获取头节点
    public Node getHead() {
        return head;
    }

    //添加节点
    public void addNode(Node node) {
        //head节点无法移动,须添加一个辅助节点用于遍历
        Node temp = head;
        //从链表最后添加数据
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
    }

    //顺序添加
    public void addOrderList(Node node) {
        Node temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                flag = true;
                break;
            } else if (temp.next.id > node.id) {
                flag = true;
                break;
            } else if (temp.next.id == node.id) {
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            node.next = temp.next;
            temp.next = node;
        } else {
            System.out.println("id" + node.id + "重复");
        }
    }

    //显示链表
    public void showLinkList(Node head) {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空。");
            return;
        }
        //head节点无法移动,须添加一个辅助节点用于遍历
        Node temp = head.next;
        while (true) {
            if (temp == null) {
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //修改节点
    public void updateLinkList(Node node) {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空。");
            return;
        }
        //定义一个辅助节点
        Node temp = head.next;
        //判断是否找到节点
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.id == node.id) {
                flag = true;
                break;
            }
            //后移
            temp = temp.next;
        }
        if (flag) {
            temp.name = node.name;
        } else {
            System.out.println("id为" + node.id + "的节点不存在。");
        }
    }

    //删除节点
    public void deleteLinkList(int id) {
        Node temp = head;
        boolean flag = false;
        //找到待删除节点的前一个结点
        while (true) {
            //已经遍历到最后,需要退出循环
            if (temp.next == null) {
                break;
            }
            if (temp.next.id == id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;
        } else {
            System.out.println("id为" + id + "的节点不存在。");
        }
    }

    //查找节点
    public void findLinkList(int id) {
        Node temp = head;
        boolean flag = false;
        //找到待查找节点的前一个结点
        while (true) {
            //已经遍历到最后,需要退出循环
            if (temp.next == null) {
                break;
            }
            if (temp.next.id == id) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println(temp.next.name);
        } else {
            System.out.println("id为" + id + "的节点不存在。");
        }
    }

    //获取节点ID
    public int getIDLinkList(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) {
            return temp.next.id;
        } else {
            System.out.println("此节点不存在。");
        }
        return 0;
    }

    //统计单链表中给定值等于e的结点个数
    public int similarLinkList(String name) {
        Node temp = head;
        int num = 0;
        while (true) {
            //已经遍历到最后,需要退出循环
            if (temp.next == null) {
                break;
            }
            if (temp.next.name == name) {
                num++;
            }
            temp = temp.next;
        }
        return num;
    }
}

public class LinkListTest {
    public static void main(String[] args) {
        LinkListDemo linkListDemo = new LinkListDemo();

        //创建节点 测试
        Node node1 = new Node(1,"Poke");
        Node node2 = new Node(2,"Hao");
        Node node3 = new Node(4,"Jie");
        Node node4 = new Node(3,"Tao");
        Node node5 = new Node(5,"2019");
        Node node6 = new Node(6,"Tao");

        //添加节点 测试
        linkListDemo.addNode(node1);
        linkListDemo.addNode(node2);
        linkListDemo.addNode(node3);
        linkListDemo.addNode(node4);
        linkListDemo.addNode(node5);
        linkListDemo.addNode(node6);

        //显示节点 测试
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        //修改节点 测试
        linkListDemo.updateLinkList(new Node(2,"Van"));
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        //删除节点 测试
        linkListDemo.deleteLinkList(5);
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        //查找节点 测试
        linkListDemo.findLinkList(1);
        System.out.println();

        //获取节点ID 测试
        System.out.println(linkListDemo.getIDLinkList("Van"));
        System.out.println();

        //统计单链表中给定值等于e的结点个数 测试
        System.out.println(linkListDemo.similarLinkList("Tao"));
        //linkListDemo.similarLinkList("Tao");
        System.out.println();


       /*
        //创建顺序节点 测试
        Node node1 = new Node(5, "Poke");
        Node node2 = new Node(4, "Hao");
        Node node3 = new Node(3, "Tao");
        Node node4 = new Node(1, "Jie");
        Node node5 = new Node(2, "2019");
        linkListDemo.addOrderList(node1);
        linkListDemo.addOrderList(node2);
        linkListDemo.addOrderList(node3);
        linkListDemo.addOrderList(node4);
        linkListDemo.addOrderList(node5);
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();
        */


    }
}

练习
1、编程实现链表的基本操作。
2、统计单链表中给定值等于e的结点个数。

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        LinkListDemo linkListDemo = new LinkListDemo();

        Scanner s = new Scanner(System.in);
        /*
        System.out.print("请输入链表长度:");
        int a = s.nextInt();

        System.out.println("请依次输入链表元素:");
        for (int i = 0; i < a; i++) {
            String b = s.next();
            linkListDemo.addNode(new Node(i + 1, b));
        }
         */

        Node node1 = new Node(1,"Poke");
        Node node2 = new Node(2,"Hao");
        Node node3 = new Node(4,"Jie");
        Node node4 = new Node(3,"Tao");
        Node node5 = new Node(5,"2019");
        Node node6 = new Node(6,"Tao");
        linkListDemo.addNode(node1);
        linkListDemo.addNode(node2);
        linkListDemo.addNode(node3);
        linkListDemo.addNode(node4);
        linkListDemo.addNode(node5);
        linkListDemo.addNode(node6);

        System.out.println("显示链表:");
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        System.out.print("请输入要删除的链表元素ID:");
        //String c = s.next();
        //linkListDemo.deleteLinkList(linkListDemo.getIDLinkList(c));
        int c= s.nextInt();
        linkListDemo.deleteLinkList(c);
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        System.out.println("请输入要修改的ID及链表元素:");
        int d = s.nextInt();
        String e = s.next();
        linkListDemo.updateLinkList(new Node(d,e));
        linkListDemo.showLinkList(linkListDemo.getHead());
        System.out.println();

        System.out.print("请输入要查找链表元素的ID:");
        int f = s.nextInt();
        System.out.print("该链表元素值为:");
        linkListDemo.findLinkList(f);
        System.out.println();

        //System.out.print("请输入要统计结点个数的单链表中给定值:");
        //String g = s.next();
        System.out.print("Tao个数为:" + linkListDemo.similarLinkList("Tao"));
        //linkListDemo.similarLinkList(g);
        System.out.println();

    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值