链表

关于链表数据结构

Java 中有个 LinkedList 集合,底层的数据结构就是双向链表数据结构,这个集合 Sun 已经帮我们写好了,这里以单向链表为例,写一个简单的集合方法,好帮助自己理解链表这种数据结构。

  • 单向链表的基本单元是节点(Node)

  • 节点包含两种属性:当前节点存储的数据 + 下一节点的内存地址

以下代码包含两个类:链表类(代表的含义其实就是 Sun 写的集合接口)、节点类

链表类:

链表有 增、删、改、查、查询元素个数 等等方法,这里只实现往列表尾部添加元素的add方法和查询元素个数size方法,这里的代码其实需要很好地理解链表这种数据结构。往链表的尾部添加元素前,需要先找到头节点header和尾节点currentLastNode,找尾节点还需要单独写一个findLast方法来寻找

如下所示:

public class Link {

    Node header;    // 声明一个头结点,并没有创建出来,默认是 null

    int size = 0;

    //  链表中元素的个数
    public int size(){
        return size;
    }

  // 往链表末尾增加元素
    public void add(Object data){
        if (header == null){    // 还没有节点,创建头结点
            header = new Node(data, null);  // 这个时候的头结点也是尾节点
        }else { // 头结点不是空,头结点已经有了。此时应该找到末尾节点,让末尾节点的 next 属性存入新节点的地址

            Node currentLastNode = findLast(header);  // 当前的尾节点
            currentLastNode.next = new Node(data,null);
        }
        size++;
    }

    //  删除链表中某个元素
    public void remove(Object data){


    }

    //  修改链表中某个数据
    public void modify(Object newData, int index){

    }

    //  查询链表中某个数据
    public int find(Object data){
        return 0;
    }

    // 专门查找末尾节点的方法
    private Node findLast(Node node){

        if (node.next == null){ // node 本身就是尾结点,直接返回 node
            return node;
        }else { // node 本身不是尾节点
            return findLast(node.next); // 递归
        }
    }
}

节点类:

public class Node {

    Object data;    // 当前节点存储的数据
    Node next;      //  下一个节点的内存地址

    // 无参数的构造方法
    public Node(){

    }
    // 有参数的构造方法
    public Node(Object data, Node next){
        this.data = data;
        this.next = next;
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        // 创建一个链表对象
        Link link1 = new Link();

        /*
        // 创建多个节点对象
        Node n1 = new Node(new Object(),new Node());
        Node n2 = new Node(new Object(),new Node());
        Node n3 = new Node(new Object(),new Node());
        Node n4 = new Node(new Object(),new Node());
        */

        link1.add(100);
        link1.add("abc");
        link1.add(new Object());

        System.out.println(link1.size());   // 3
    }
}

运行结果:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
3

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值