(Java)单向链表实现(2)

由上节可知,如果由用户去处理各个节点的关系,会非常麻烦,所以最好将节点的操作进行封装,这样用户使用起来会比较方便。

例如如果要删除节点,则直接修改上一个节点的引用即可:
在这里插入图片描述

class Link{
    class Node{ // 将节点类定义成内部类
        private String data;
        private Node next;
        public Node(String data){
            this.data = data;
        }
        public void add(Node newNode){ // 增加一个 add 操作
            if(this.next == null){ // 判断下一个节点是否为空
                this.next = newNode; // 如果下一个节点为空,则把新节点设置在next位置上
            }else { // 如果不为空,表示还有下一个节点
                this.next.add(newNode); // 在一个位置增加
            }
        }
        public void print(){
            System.out.print(this.data + "\t");
            if(this.next !=null){ // 如果下一个节点不为空,则继续打印
                this.next.print(); // 让下一个节点输出
            }
        }
        public boolean search(String data){ // 内部定义搜索方法
            if(data.equals(this.data)){ // 判断当前节点的名字是否与查找的一致
                return true; // 如果一致,则返回 true
            }else {
                if(this.next != null){ // 下一个节点存在,则继续查找
                    return this.next.search(data); // 返回下一个查询结果
                }else {
                    return false; // 节点不存在,返回 false
                }
            }
        }
        public void delete(Node previous,String data){
            // 删除节点
            if(data.equals(this.data)){
                previous.next = this.next; // 空出当前节点
            }else {
                if(this.next !=null){
                    this.next.delete(this,data); // 继续向下找
                }
            }
        }
    };
    private Node root; // 表示根节点
    public void addNode(String data){
        // 增加节点的方法
        Node newNode = new Node(data); // 建立一个新的节点
        if(this.root == null){ // 没有根节点
            this.root = newNode; // 将第一个节点设置为根节点
        }else{
            this.root.add(newNode); // 添加到合适的位置
        }
    }
    public void printNode(){ // 打印全部的节点
        if(this.root !=null){ // 判断是否存在根节点
            this.root.print();
        }
    }
    public boolean contains(String name){ // 判断元素是否存在
        return this.root.search(name); // 调用Node 类中的 search() 方法
    }
    public void deleteNode(String data){ // 删除节点
        if(this.contains(data)){ // 如果节点存在,则执行删除操作
            if(this.root.data.equals(data)){ //判断根节点是否满足要求
                this.root = this.root.next; // 将根节点之后的内容设置成根节点
            }else {
                this.root.next.delete(root,data); // 删除节点
            }
        }
    }
};

public class Test{
    public static void main(String[] args){
        Link l = new Link();
        // 增加节点 A,B,C,D,E
        l.addNode("A");
        l.addNode("B");
        l.addNode("C");
        l.addNode("D");
        l.addNode("E");
        System.out.println("=======删除之前=======");
        l.printNode(); // 输出节点
        l.deleteNode("C"); // 删除节点
        l.deleteNode("D"); // 删除节点
        System.out.println();
        System.out.println("=======删除之后=======");
        l.printNode();
        System.out.println("查询节点:" + l.contains("A"));
    }
}

在这里插入图片描述
上面的程序对要操作的节点类进行了包装,用户可以直接调用包装后的类,即可方便执行节点的增加、删除、查找操作。

此处理解其操作原理即可,实际应用中,Java 已经为用户提供了大量的数据结构实现类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值