package hnch;
public class DLinkList {
DLinkNode Head; //双向链表的头
DLinkNode Tail; //双向链表的尾
/**
* 双向链表初始化
*/
public void Init_DLinkList(){
Head=new DLinkNode(null,null);
Head.next=Head;
Head.prior=Head;
}
/**
* 获得双向链表的长度
*/
public int Get_Length_DLinkList(){
int count=0;
DLinkNode cur=Head;
while(cur!=null){
cur=cur.next;
count++;
}
return count;
}
/**
* 输出双向链表
*/
public void Show_DLinkList(){
DLinkNode cur=Head;
while(cur!=null){
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.print("\n");
}
/**
* 判断双向链表是否包含值
*/
public boolean Locate_DLinkList(int num){
DLinkNode cur=Head;
while(cur!=null){
if(cur.data==num){
return true;
}
else{
cur=cur.next;
}
}
return false;
}
/**
* 头插法...
*/
public void Insert_DLinkList(int data){
DLinkNode node=new DLinkNode(data);
if(Head==null){
Head=node;
Tail=node;
}
else{
node.next=Head;
Head.prior=node;
Head=node;
}
}
/**
* 尾插法
*/
public void Insert_DLinkList2(int data){
DLinkNode node=new DLinkNode(data);
if(Head==null){
Head=node;
Tail=node;
}
else{
Tail.next=node;
node.prior=Tail;
Tail=node;
}
}
/**
* 根据位置获得结点
*/
public DLinkNode findIndex_DListNode(int index){
DLinkNode cur=Head;
while(index!=0){
cur=cur.next;
index--;
}
return cur;
}
/**
* 根据位置插入结点,牵引从0开始
*/
public void Isert_DLinkList3(int index,int elem){
DLinkNode node=new DLinkNode(elem);
//判断index位置的合法性
if(index<0 || index>Get_Length_DLinkList()){
System.out.println("插入位置错误");
}
//头,尾插入情况
if(index==0){
Insert_DLinkList(elem); //头插法
return;
}
if(index==Get_Length_DLinkList()){
Insert_DLinkList2(elem); //尾插法
return;
}
//找到index的位置
DLinkNode cur=findIndex_DListNode(index);
//开始插入
node.next=cur;
cur.prior.next=node;
cur.prior=cur.prior;
cur.prior=node;
}
/**
* 删除第一个值为elem的结点
*/
public void Delete_DLinkListByVal(int elem){
DLinkNode cur=Head;
while(cur!=null){
if(cur.data==elem){
//删除头节点的情况
if(Head.data==elem){
Head=Head.next;
//只有一个节点的情况
if(Head!=null){
Head.prior=null;
}
else{
cur.prior.next=cur.next;
//删除中间节点的情况
if(cur.next!=null){
cur.next.prior=cur.prior;
}
//删除尾节点的情况
else{
Tail=cur.prior;
}
}
return;
}
cur=cur.next;
}
}
}
/**
* 删除所有值为elem的结点
*/
public void Delete_AllByVal(int elem){
DLinkNode cur=Head;
while(cur!=null){
if(cur.data==elem){
//删除头节点的情况
if(Head.data==elem){
Head=Head.next;
//只有一个节点的情况
if(Head!=null){
Head.prior=null;
}else {
Tail=null;
}
}else{
cur.prior.next=cur.next;
//删除中间节点的情况
if(cur.next!=null){
cur.next.prior=cur.prior;
}
//删除尾节点的情况
else{
Tail=cur.prior;
}
}
}
cur=cur.next;
}
}
/**
* 清空双向链表
*/
public void Clear_DLinkList(){
DLinkNode cur=Head;
//中间节点
while(cur!=null){
DLinkNode curNext=cur.next;
cur.prior=null;
cur.next=null;
cur=curNext;
}
//头尾节点
Head=null;
Tail=null;
}
}