链表 02 添加

在链表头插入节点 - void addFirst(E e)

  • head首先是个Node的引用型变void addFirst(E e)量,它可以指向一块内存空间,也可以指向null,引用型变量只具备指的能力;
  • LinkedList这种数据结构,只包含了一个头指针head,head是个引用型变量,只具备指的能力;在LinkedList初始化的时候,其只包含了一个头指针head,这个head指向null;
  • new Node(e)创建的是一个next指向null的节点;
  • 向链表中添加一个元素的时候要本着“先入队再整队”的原则;
  • node.next = head即为“先入队”,让新元素链入队列;head指向null,那么node.next就指向null;head指向队首节点,那么node.next就指向队首节点,从而排在最前面成为队首节点;
  • head = node即为“后整队”,让head重新“追”到队首;head和node都是Node类型的引用型变量,所以head可以指向node所指向的内存空间;
// 在链表头添加新的元素e
public void addFirst(E e){
//        Node node = new Node(e);
//        node.next = head;
//        head = node;

    head = new Node(e, head);
    size ++;
}

在链表的任一位置插入节点 - void add(int index, E e)

  • 在链表中是没有索引这个概念的,这里引入索引的概念,便于理解,作练习用;
  • 如果size是3,那么0,1,2,3这4个位置都是合法的插入位置;
  • 在寻找插入位置的前驱节点时,注意循环的终止条件 i < index -1i 会停在要插入位置的前2个的位置上,此时 prev = prev.next 会使prev停在插入位置的前1个位置,即找到了插入节点的前驱节点;
  • 在链表中间插入元素时,插入位置的前一个元素要确保“新人抓牢再松手”;
  • 插入完成后维护链表的节点个数size;
// 在链表的index(0-based)位置添加新的元素e
// 在链表中不是一个常用的操作,练习用:)
public void add(int index, E e){

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

    if(index == 0)
        addFirst(e);
    else{
        Node prev = head;
        for(int i = 0 ; i < index - 1 ; i ++)
            prev = prev.next;

//            Node node = new Node(e);
//            node.next = prev.next;
//            prev.next = node;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值