前言
数据结构在java中的集合中,有很多数据结构的实现.
例如:线性结构中的:线性表(LinkedList),栈(Stack),队列(Queue)
代码实现和解析
1.LinkList自定义实现
/**
* 双向链表 的增删改查
* @author ccj
*
*/
public class DoubleLinkList<E> {
//头结点
private Node<E> first;
//尾结点
private Node<E> last;
//大小
private int size;
public int getSize() {
return size;
}
//
public DoubleLinkList(){
first=null;
last=null;
}
/**
* 判断是否为空
*/
public boolean isEmpty(){
if(size==0){
return true;
}else{
return false;
}
}
/**
* 插入节点,在头结点后插入
*/
public void insertFirst(E e){
//取链表头结点
final Node<E> f = first;
//新建节点 前驱为null,后继为头结点
Node<E> node=new Node<E>(null,e,f);
//将新的node作为头结点
first=node;
//如果原来的头结点为null,就说明链表为空,既头结点和尾结点都为同一个,
//如果存在,就把node作为旧的头指针的前驱
if (f == null)
last = node;
else
f.prev = node;
size++;
first=node;
}
/**
* 插入节点,在尾结点后插入
* 类似于头结点插入
*/
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
}
/**
* 根据下标得到元素
* @param index
* @return
*/
Node<E> getObject(int index){
//size >> 1 表示 二进制右移一位 同 size/2
//前半部分时 从前向后找,后半部分时,从后向前找,这样效率高
if(index>=size){
throw new IndexOutOfBoundsException();
}
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
/**
* 删除节点
*/
public int deleteFirst(){
Node<E> tmp=first;
if(tmp==null){
throw new NoSuchElementException();
}
//解除绑定
Node<E> next=tmp.next;
first = next;
if(next==null){
last=null;
}else{
next.prev=null;
}
size--;
return 0;
}
/**
* 更改结点
*/
public void set(int index,E object){
checkElementIndex(index);
Node<E> node=getObject(index);
node.item=object;
}
private void checkElementIndex(int index) {
if (index>=size)
throw new IndexOutOfBoundsException();
}
public void display(){
Node current=first;
while(current!=null){
current.display();
current=current.next;
}
}
static class Node<E> {
E item;
//后继
Node<E> next;
//前驱
Node<E> prev;
/**
*
* @param prev
* @param element
* @param next
*/
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
/**
* 显示
*/
public void display(){
System.out.println("data is "+item);
}
}
}
输出
--增加---
data is 3
data is 2
data is 1
--删除---
data is 2
data is 1
--改---
data is 0
data is 1
--查看---
data is 1
--大小为--
2