链表

本文介绍了链表的链式存储概念,每个节点包含数据和指向下一个节点的引用。强调了在Java中使用泛型确保链表内数据类型的统一,并提供了使用内部类实现链表的基本操作,如添加节点、获取元素个数和判断空链表的方法。

链表

链表是以节点的方式存储的,即链式存储。每个节点包含data域和next域(指向下一节点)。链表(动态数组)的本质是利用对象引用的逻辑关系来实现类似于数组的数据存储逻辑,一个链表由若干个节点(Node)所组成,每一个节点依赖于上一个节点的引用形成一个“链”的形式。

 

注:在进行Node设计时,为了避免程序开发中可能出现ClassCastException安全隐患,对于保存的数据类型都用泛型进行定义,可以保证在一个链表中的数据类型统一。

示例:使用Node类存放多个数据


public class carboxlink {
    public static void main(String[] args) {
        Node<String> n1 = new Node<>("火车头");
        Node<String> n2 = new Node<>("一车厢");
        Node<String> n3 = new Node<>("二车厢");
        Node<String> n4 = new Node<>("三车厢");
        Node<String> n5 = new Node<>("火车尾");
        n1.setNext(n2);
        n2.setNext(n3);
        n3.setNext(n4);
        n4.setNext(n5);
        printNode(n1);
    }
    public static void printNode(Node<?> node){
        if(node != null){
            System.out.print(node.getData()+"——>");
            printNode(node.getNext());                  //递归调用
        }
    }
}

class Node<E>{
    private E data;
    private Node<E> next;
    public Node(E data){                            //创建节点时,保存数据
        this.data = data;
    }
    public E getData(){                            //获取数据
        return this.data;
    }
    public void setNext(Node<E> next){             //设置节点
        this.next = next;
    }

    public Node<E> getNext() {                  //返回节点
        return this.next;
    }
}

链表是一种动态数组,我们不需要过多关注其内部是如何存储,只需要了解数据的保存于获取,所以在实际应用中,链表需要对外部封装Node实现与操作细节。

使用内部类来实现链表

 

实现一:添加节点、获取链表元素个数、空集合判断功能

(1)定义链表接口



public interface ILink<E> {
    //在此处定义若干链表的操作方法
    //向链表中进行数据的存储,每个链表所保存的数据类型相同,不允许保存null数据
    //定义数据增加方法
    public void add(E e);
    //获取链表集合中元素的保存个数
    public int size();
    //判断当前链表是否为空
    public boolean isEmpty();
}

(2)实现链表接口




public class LinkImple<E> implements ILink<E> {
    private Node<E> root;//保存根节点信息
    private int count;
    //使用内部类的机构进行定义,这样外部类与内部类可以直接进行私有成员访问
    private class Node<E>{ //使用LinkImple之类中定义Node内部类,是为了放置其他程序类使用Node类,所以采用了private关键字封装
        private E Data;
        private Node<E> next;

        public Node(E data){
            this.Data = data;
        }
        public void addNode(Node<E> newNode){
            if(this.next == null){
                this.next = newNode;
            }else{
                this.next.addNode(newNode);
            }
        }
    }
    //以下为Link类中定义的结构
    @Override
    public void add(E e) {
        if(e == null){
            return ;
        }
        //数据本身不具有节点先后的关联特性,想要实现关联处理就必须将数据包装在Node中
        Node<E> newNode = new Node<E>(e);           //创建一个新的节点
        if(this.root == null){
            this.root = newNode;
        }else {
            this.root.addNode(newNode);
        }
        this.count++;
    }

    @Override                   //返回链表元素的数目
    public int size() {
        return this.count;
    }

    @Override
    public boolean isEmpty() {
        return this.count==0;
    }

}

(3)主方法建立指定链表



public class testlink {
    public static void main(String[] args) {
        ILink<String> link = new LinkImple<String>();       //实例化链表对象
        System.out.println("数据保存前链表的元素个数:"+link.size());
        link.add("蒸汽时代");
        link.add("电气时代");
        link.add("大数据时代");
        link.add("人工智能时代");
        System.out.println("数据保存后链表元素个数:"+link.size());
    }
}

至于链表的其他功能结构,以后更新~~

以上代码来源于李兴华《java从入门到项目实战》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值