双向链表

来源:互联网 发布:拦截导弹算法pascal 编辑:程序博客网 时间:2024/05/22 08:18

双向链表:一个数据域,两个指针域

/*

 * 双向链表的数据结构

 */

public class ListNode {

public ListNode Previous;   //前节点

public ListNode Next; //后节点

public int Value;        //值

public ListNode(int NewValue)

{

    Value=NewValue;

}

}

/*

 * 双向链表算法实现类,实现了添加,插入,删除,打印

 */

public class Clist {

private ListNode Head;  //头指针

private ListNode Tail;  //尾指针

private ListNode Current;  //当前指针

private int ListCountValue;  //链表数据的个数

public Clist() //构造函数

{

    ListCountValue = 0;  //初始化

    Head = null; //头指针为空

    Tail = null; //尾指针为空

}

//添加

public void Append(int DataValue)

{

    ListNode NewNode = new ListNode(DataValue); //初始化节点

    if (ListCountValue==0) //如果链表为空

    {

        //头节点和尾节点都是该值

        Head = NewNode;

        Tail = NewNode;

    }

    else

   {

        Tail.Next = NewNode; //尾指针指向添加的数据

        NewNode.Previous = Tail; //数据的前一个指针指向原来的尾节点

        Tail = NewNode; //尾节点为新添加的数据

    }

    Current = NewNode; //当前节点为尾节点

    ListCountValue += 1;  //链表数据个数加1

}

//插入

public void Insert(int DataValue)

{

    ListNode NewNode = new ListNode(DataValue);

    if (ListCountValue==0) //如果链表为空

    {

        Append(DataValue);  //为空表,则添加

        return; //跳出程序

    }

    if (Current==Head) //如果当前节点为头结点

    {

         //为头部插入

         NewNode.Next = Head; //先结点的后指针指向原来的头节点

         Head.Previous = NewNode; //原来的头结点的前指针指向新添加的节点

         Head = NewNode; //新节点为头结点

         Current = Head; //当前节点为头节点

         ListCountValue += 1; //节点数加1

         return; //跳出程序

     }

     //中间插入

     NewNode.Next = Current; //新节点的后指针指向当前节点

     NewNode.Previous = Current.Previous; //新节点的前指针指向当前节点的前一个节点

     Current.Previous.Next = NewNode; //当前节点的前一个节点的后指针指向前一个

     Current.Previous = NewNode; //当前节点的前指针指向新节点

     Current = NewNode; //当前节点为新节点

     ListCountValue += 1; //链表节点数加1

}

//删除

public void Delete()

{

        

if (ListCountValue!=0) //若链表不为空

    {

            

         if (Current==Head) //若当前节点为头结点

         {

             Head = Current.Next; //头结点为当前节点指定的下个节点

             Current = Head; //当前节点为头结点

             ListCountValue -= 1; //节点数减1

             return; //跳出程序

         }

         if (Current==Tail) //若当前节点为尾节点

         {

             Tail = Current.Previous; //尾节点就为当前节点指向的前一个节点

             Current = Tail; //当前节点为尾节点

             ListCountValue -= 1; //节点数减1

             return; //跳出程序

         }

         Current.Previous.Next = Current.Next;  //若从链表中间删除数据

         Current = Current.Previous; //当前节点为前一个节点

         ListCountValue -= 1; //节点数减1

      }

 }

//打印

public void printAllListNode()

{

if(ListCountValue!=0)

{

    System.out.println("输出链表中的所有数据:");

    Current = Head;         //当前节点为头结点

    for(int i=0;i<ListCountValue;i++)

     {

     System.out.println(Current.Value); //输出当前节点值

     Current = Current.Next;     //当前节点为下一个节点

     }

    }

}

}

/*

 * 测试类

 */

public class Test {

public static void main(String[] args) {

Clist clist = new Clist();

clist.Append(12); //添加尾节点

clist.Append(10); //添加尾节点

clist.Insert(66); //插入新节点

clist.Insert(33);                           //插入新节点

clist.Delete();                             //删除当前节点的下一节点

clist.printAllListNode(); //输出链表中所有的数据

}

}