链表 03 虚拟头节点

本文详细介绍了在LinkedList数据结构中引入虚拟头节点的作用及其带来的便利,包括简化链表操作,如在队首插入元素时无需特殊处理,以及如何通过游标定位插入位置的前驱节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 引入虚拟头节点dumyHead使得LinkedList成了只包含虚拟头节点的数据结构,在初始化LinkedList的时候,为dumyHead分配了空间(不像head指针在初始化的时候没有分配空间,只是指向null),此时dumyHead中,dumyHead.e = null,dumyHead.next = null;
  • 由于虚拟头节点的引入,使得向LinkedList在指定位置添加元素时,无需对在队首插入元素的情况做特殊处理;
  • 由于链表的插入需要找到插入节点的前驱节点,因此游标prev要停在插入位置的前一个位置;初始时,将prev指向dumyHead,当i = 0时,prev向右移动一格,prev指向索引为0的节点,即第一个元素(dumyHead是第一个节点前的节点),所以i = index - 1时,prev指向了插入位置的前一个位置,从而找到了插入节点的前驱节点;
public class LinkedList<E> {

    private class Node{
        public E e;
        public Node next;

        public Node(E e, Node next){
            this.e = e;
            this.next = next;
        }

        public Node(E e){
            this(e, null);
        }

        public Node(){
            this(null, null);
        }

        @Override
        public String toString(){
            return e.toString();
        }
    }

    private Node dummyHead;
    private int size;

    public LinkedList(){
        dummyHead = new Node();
        size = 0;
    }

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

    // 返回链表是否为空
    public boolean isEmpty(){
        return size == 0;
    }

    // 在链表的index(0-based)位置添加新的元素e
    // 在链表中不是一个常用的操作,练习用:)
    public void add(int index, E e){

        if(index < 0 || index > size)
            throw new IllegalArgumentException("Add failed. Illegal index.");

        Node prev = dummyHead;
        for(int i = 0 ; i < index ; i ++)
            prev = prev.next;

        prev.next = new Node(e, prev.next);
        size ++;
    }

    // 在链表头添加新的元素e
    public void addFirst(E e){
        add(0, e);
    }

    // 在链表末尾添加新的元素e
    public void addLast(E e){
        add(size, e);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值