双链表
在单链表的每个节点中设置一个指向其前一个节点的指针域,这样就形成了双链表,节点结构如下:
prior | data | next |
其中,data 为数据域,存放数据元素;prior 为前驱指针,存放该节点上一个节点地址;next为后继指针,存放该节点下一个节点的地址。
双链表的实现
双链表除了插入,删除操作以外,其他操作基本和单链表相同。这里只实现插入,删除操作。
插入
/**
* @MethodName: insert
* @Description: 在链表指定位置插入节点
* @param i
* @param node
* @author 周扬
* @throws Exception
* @date 2017年6月5日 上午11:25:10
*/
public void insert(int i,DoublyNode node) throws Exception{
DoublyNode p=headPointer;
int count=0;
while(p!=null&&count<i-1){
//获取原先第i位置节点的上一个节点
p=p.getNextNode();
count++;
}
if(p==null){
//如果上一个节点为空,则抛出异常
throw new Exception("位置"+i+"不存在");
}
//获取原先i位置的节点
DoublyNode oldNextp= p.getNextNode();
//设置新节点的下一个节点为oldNextp
node.setNextNode(oldNextp);
//设置新节点的上一节点为p
node.setPrior(p);
//设置原先上一个节点的下一个节点为新值
p.setNextNode(node);
}
删除
/**
* @MethodName: delete
* @Description: 删除指点位置的节点,并返回被删除节点的数据元素
* @param i
* @return
* @throws Exception
* @author 周扬
* @date 2017年6月5日 上午11:52:32
*/
public Object delete(int i) throws Exception{
DoublyNode p=headPointer;
int count=0;
while(p!=null&&count<i-1){
//获取原先第i位置节点的上一个节点
p=p.getNextNode();
count++;
}
if(p==null||p.getNextNode()==null){
//如果上一个节点为空或者第i个节点为空,则抛出异常
throw new Exception("位置"+i+"不存在");
}
//获取目标节点
DoublyNode target=p.getNextNode();
//获取目标节点的下一个节点
DoublyNode targetNext=target.getNextNode();
//目标节点的上一个节点的next域指向targetNext
p.setNextNode(targetNext);
//目标节点的下一个节点的prior域指向目标节点的上一个节点
targetNext.setPrior(p);
//保存被删除元素的数据元素
Object data=target.getData();
//释放被删除元素的内存
target=null;
//返回目标节点数据元素
return data;
}