Java 实现双链表数据结构
2018-02-03 13:02
323 查看
首先,双链表也是链表的一种;与单链表不同的是,他不仅有着当前节点下一个节点的指针,也存有当前节点上一个节点的指针,这样就形成了一种循环的链表结构。对于双链表,增加新的节点或者删除某个节点十分非常方便的,只需要修改所在相关节点前后节点的指针指向就可以了。所以对于双链表中的任何一个节点都有着三个元素:上一个节点的指针,下一个节点的指针以及当前节点所存储的对象。下边是java如何实现双链表结构:
public class DoubleLink<T>{
private DNode mHead;//链表头
private int mcount;//节点数目
private class DNode<T>{
public DNode pre;
public DNode next;
public T value;
public DNode(T value,DNode pre,DNode next){
this.pre=pre;
this.next=next;
this.value=value;
}
}
public DoubleLink(){
mHead =new DNode<T>(null,null,null);
mHead.pre=mHead.next=mHead;
mcount=0;
}
public int getSize(){
return mcount;
}
public boolean isEmpty(){
return mCount==0;
}
public T get(int index){
return getNode(index).value;
}
public T getNode(int index){
if(index<0||index>=mCount){
throw new IndexOutOfBoundsException();
}
if(index<=mCount/2){
DNode<T> node =mHead.next;
for(int i=0;i<index;i++){
node=node.next;
}
return node;
}
DNode<T> rNode = mHead.pre;
int rIndex = mCount-index-1;
for(int j=0;j<rIndex;j++){
rNode=rNode.pre;
}
return rNode;
}
public void insert(int index,T value){
if(index==0){
DNode node = new DNode<T>(value,mHead,mHead.next);
mHead.next=node;
node.next.pre=node;
mCount++;
return;
}
DNode iNode =getNode(index);
DNode tNode = new DNode<T>(value,iNode.pre,iNode);
iNode.pre.next=tNode;
iNode.pre=tNode;
mCount++;
return;
}
public void insertFirst(T value){
insert(0,value);
}
public void appendLast(T value){
DNode node = new DNode<T>(value,mHead.pre,mHead);
mHead.pre.next=node;
mHead.pre=node;
mcount++;
}
public void remove(int index){
DNode node =getNode(index);
node.pre.next=node.next;
node.next.pre=node.pre;
node=null;
mCount--;
}
public void removeFirst(){
remove(0);
}
public void removeLast(){
remove(mCount-1);
}
}
public class DoubleLink<T>{
private DNode mHead;//链表头
private int mcount;//节点数目
private class DNode<T>{
public DNode pre;
public DNode next;
public T value;
public DNode(T value,DNode pre,DNode next){
this.pre=pre;
this.next=next;
this.value=value;
}
}
public DoubleLink(){
mHead =new DNode<T>(null,null,null);
mHead.pre=mHead.next=mHead;
mcount=0;
}
public int getSize(){
return mcount;
}
public boolean isEmpty(){
return mCount==0;
}
public T get(int index){
return getNode(index).value;
}
public T getNode(int index){
if(index<0||index>=mCount){
throw new IndexOutOfBoundsException();
}
if(index<=mCount/2){
DNode<T> node =mHead.next;
for(int i=0;i<index;i++){
node=node.next;
}
return node;
}
DNode<T> rNode = mHead.pre;
int rIndex = mCount-index-1;
for(int j=0;j<rIndex;j++){
rNode=rNode.pre;
}
return rNode;
}
public void insert(int index,T value){
if(index==0){
DNode node = new DNode<T>(value,mHead,mHead.next);
mHead.next=node;
node.next.pre=node;
mCount++;
return;
}
DNode iNode =getNode(index);
DNode tNode = new DNode<T>(value,iNode.pre,iNode);
iNode.pre.next=tNode;
iNode.pre=tNode;
mCount++;
return;
}
public void insertFirst(T value){
insert(0,value);
}
public void appendLast(T value){
DNode node = new DNode<T>(value,mHead.pre,mHead);
mHead.pre.next=node;
mHead.pre=node;
mcount++;
}
public void remove(int index){
DNode node =getNode(index);
node.pre.next=node.next;
node.next.pre=node.pre;
node=null;
mCount--;
}
public void removeFirst(){
remove(0);
}
public void removeLast(){
remove(mCount-1);
}
}
相关文章推荐
- 数据结构学习----线性表的链式表示之循环双链表(Java实现)
- 多种数据结构的Java实现(精)
- 利用java实现数据结构中常用的插入排序和快速排序算法
- Java中常用数据结构的实现类 Collection和Map
- 数据结构复习:栈-Java数组实现
- Java中常用数据结构的实现类 Collection和Map
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构的Java实现——栈和队列
- 数据结构的Java实现——顺序表
- java 利用 LinkedList类实现 数据结构 栈.......
- java 利用 LinkedList类实现 数据结构 栈.......
- java 利用 LinkedList类实现 数据结构 栈.......
- 数据结构实现循环双链表
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 多种数据结构的Java实现
- 数据结构的Java实现——二叉树
- Java,数据结构,线性表,顺序实现
- Java中常用数据结构的实现类 Collection和Map
- 利用java实现数据结构中常用的插入排序和快速排序算法