java双向 链表add_Java 双向链表的简单实现

/**

* Description 双向链表

* Date 2017-09-03

* Author Edgar

*/

public class Link {

//头结点

private Node first;

//委节点

private Node last;

//节点大小

private int size;

public Link(){

size=0;

}

/**

* 向链表尾部添加元素

* @param e

*/

public void addLast(E e){

final Node l = last;

final Node newNode = new Node<>(l, e, null);

last = newNode;

//若链表没有数据则把新节点赋给头节点,否则原尾结点指向新节点

if (l == null)

first = newNode;

else

l.next = newNode;

size++;

}

/**

* 向链表头部添加元素

* @param e

*/

public void addFirst(E e) {

final Node f = first;

final Node newNode = new Node<>(null, e, f);

first = newNode;

//若链表没有数据则把新节点赋给尾节点,否则原头结点的前驱节点指向新节点

if (f == null)

last = newNode;

else

f.prev = newNode;

size++;

}

/**

* 默认采用队列模式添加元素

* @param e

*/

public void add(E e){

addLast(e);

}

/**

* 向指定位置添加原

* @param e

* @param index

*/

public void add(E e,int index){

if (index<0 || index > size){

throw new IndexOutOfBoundsException();

}

if (index==size){

addLast(e);

return;

}

if (0==index){

addFirst(e);

return;

}

Node node=first;

//找到要插入位置的前一个节点

for (int i = 0; i < index-1; i++) {

node=node.next;

}

Node newNode = new Node<>(node, e, node.next);

node.next=newNode;

size++;

}

/**

* 删除指定位置的元素

* @param index

*/

public void remove(int index){

if (index<0 || index >= size){

throw new IndexOutOfBoundsException();

}

if (0==index){

removeFirst();

return;

}

if (index==size-1){

removeList();

return;

}

Node node=first;

//找到要删除元素的前一个节点

for (int i = 0; i < index-1; i++) {

node=node.next;

}

Node q=node.next;

node.next=q.next;

size--;

}

/**

* 删除链表中的第一个元素

*/

public void removeFirst(){

Node f=first;

if (null==f){

throw new NoSuchElementException();

}

final Node next=f.next;

first=next;

if (null!=next){

next.prev=null;

}

size--;

}

/**

* 删除链表中的最后一个元素

*/

public void removeList(){

Node l=last;

if (null==l){

throw new NoSuchElementException();

}

final Node la=l.prev;

last=la;

if (null!=la){

la.next=null;

}

size--;

}

/**

* 找指定位置的元素

* @param index

* @return

*/

public E get(int index){

if (index<0 || index >= size){

throw new IndexOutOfBoundsException();

}

Node f=first;

if (null==f){

throw new NoSuchElementException();

}

int j=0;

while (null!=f && j

f=f.next;

j++;

}

return null==f?null:f.data;

}

/**

* 获取链表中的第一个元素

* @return

*/

public E getFirst(){

return getSide(() -> first);

}

/**

* 获取链表中的最后一个元素

* @return

*/

public E getLast(){

return getSide(() -> last);

}

/**

* 获取链表两端的元素

* @param supplier

* @return

*/

private E getSide(Supplier> supplier){

final Node f=supplier.get();

if (null==f){

throw new NoSuchElementException();

}

return f.data;

}

public int size(){

return this.size;

}

//节点类

private static class Node{

E data;

Node next;

Node prev;

public Node(Node prev,E data,Node next){

this.data=data;

this.next=next;

this.prev=prev;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值