单向链表的实现(Java版)

链表类:

public class Linked01<E> {

    //头结点
    private Node<E> first;

    //尾结点
    private Node<E> last;

    //尾插法
    public void addLast(E item){
        final Node<E> newNode = new Node<E>(item);//新节点
        final Node<E> l = last;//保存原尾结点
        last = newNode;//尾结点指向新节点
        //判断原尾结点是否为null,若原尾结点为null,即新节点既是尾结点也是头节点
        if(l == null){
            first = newNode;//头节点指向新节点
        }else {
            l.next = newNode;//原尾结点指向新节点,即指向新的尾结点
        }
    }

    //头插法
    public void addFirst(E item){
        //新节点
        final Node<E> newNode = new Node<E>(item);

        //保存原头节点
        final Node<E> f = first;
        first = newNode;//头节点指向新节点
        //判断原头结点是否为null,若原头结点为null,即新节点既是头结点也是尾节点
        if(f == null){
            last = newNode;//尾结点指向新节点
        }else {
            newNode.next = f;//新节点的后继指向原头节点
        }
    }

    //重写toString方法,打印链表
    public String toString(){
        StringJoiner sj = new StringJoiner("->");
        for(Node<E> node = first;node != null;node = node.next){
            sj.add(node.item.toString());
        }
        return sj.toString();
    }

    //节点类
    static class Node<E>{
        E item;//数据域
        Node<E> next;//指针域
        public Node(E data){
            this.item = data;
        }
    }
}

测试类:

public class Test01 {
    public static void main(String[] args) {
        Linked01<String> linked01 = new Linked01<String>();
        linked01.addFirst("A");//头插法
        linked01.addFirst("B");
        linked01.addFirst("C");
        linked01.addFirst("D");
        System.out.println(linked01.toString());
        linked01.addLast("a");//尾插法
        linked01.addLast("b");
        linked01.addLast("c");
        linked01.addLast("d");
        System.out.println(linked01.toString());
    }
}

运行结果:

总结

头插法:将新节点添加至链表头部。

第一步:创建新节点 newNode ;

第二步:获取原来的头节点 f ;

第三步:将头节点 first 指向新节点 newNode ;

第四步:判断原头节点是否为null:为null即新节点 newNode 既是头节点 first 也是尾结点 last ,则将尾结点 last 指向新节点 newNode ;否则只需将新节点 newNode 的 next 指向原头节点 f 即可。


尾插法:将新节点添加至链表尾部。

第一步:创建新节点 newNode ;

第二步:获取原来的尾结点 l ;

第三步:将尾结点 last 指向新节点 newNode ;

第四步:判断尾头节点是否为null:为null即新节点 newNode 既是尾节点 last 也是头结点 first ,则将头结点 first 指向新节点 newNode ;否则只需将原尾结点 l 的 next 指向新节点 newNode 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值