双端链表

1数据结构

 2 特点

保持一个对链表最后一个元素的引用

3 方法摘要

class FirstLastList

   { // -------------------------------------------------------------

   public boolean isEmpty()      ;    // true if no links 

// ------------O[1]-------------------------------------------------

   public void insertFirst(LinkNode dd)  ;// insert at front of list 

// ------------O[1]-------------------------------------------------

   public void insertLast(LinkNode dd)  ; // insert at end of list 

// ------------O[1]-------------------------------------------------

   public long deleteFirst()   ;      // delete first link 

// -------------O[1]------------------------------------------------

   public void displayList();

// -------------------------------------------------------------

   }  // end class FirstLastList

4 代码

4.1 链表节点元素

public class LinkNode extends Object{

    public int iData;//data

    public double dData;//data

    public LinkNode next; //reference to next link

    

    //constructor

    public LinkNode(int id,double dd){

        iData = id;

        dData = dd;

    }

    public void displayLink(){

        //display itself

        System.out.println

        ("iData  :  "+iData+"    dData:"+dData);

    }

}//end class LinkNode

4.2 双向链表

public class FirstLastList {

    public static LinkNode first;

    private static LinkNode last;

    //ref to first link on list

    public void LinkList(){

        first = null;

        last = first;

        // constructor : no items on list yet

    }

    public boolean isEmpty(){

        return first==null;

    }

    /*时间效率 O(1)*/

    public void insertFirst(int i,double d){

        LinkNode newNode = new LinkNode(i,d);

         

            newNode.next = first;

            first = newNode; 

    }

    /*时间效率 O(1)*/

    public void insertLast(int i,double d){

        LinkNode newNode = new LinkNode(i,d);

        if(isEmpty()){

            last= newNode;

            first = last;

        }

         last.next = newNode ; 

         last= newNode;

    }

    public void displayList(){

        LinkNode current = first;

        System.out.println("From first to last   :");

        while(current!=null){

            current.displayLink();

            current = current.next;

        }

    } 

    /*时间效率 O(1)*/

    public LinkNode deleteFirst(){ 

        if (isEmpty()){

            return null;

        }

        LinkNode temp = first;

        first = first.next;

        return temp;

    }

 

    public LinkNode deleteDedecate(LinkNode node){//O[N] : 包含线性查找 

        LinkNode current = first;                                                                   

          LinkNode pre = current;                                                                     

          while (current!=null){//the  loop end condition:traverse to the last node of the link       

              if(current.dData == node.dData && current.iData==node.iData){//find the node                    

                if(current == first) first = first.next;                                                

                  pre.next = current.next;                                                                

                  return current;                                                                         

              }else{//go on to find it                                                                  

                  pre = current;                                                                          

                  current = pre.next;                                                                     

              }                                                                                         

          }                                                                                           

          return null;     

    }

    public LinkNode find(LinkNode node){//O[N] : 包含线性查找 

        LinkNode current = first;

         while (current!=null){

        //     current.displayLink();

             if(current.dData ==node.dData && current.iData == node.iData){

                 return current;

             }

            current = current.next;

         }

        return null;

    }

}

4.3 APP

    public static void main(String[] args) {

                //make a new List

                FirstLastList theList = new FirstLastList();

                //insert nodes

                theList.insertLast(11, 11.11);

                theList.insertLast(22, 22.22);

                theList.insertLast(33, 33.33);

                theList.insertLast(44, 44.44);  

                 

                System.out.println("Before delete  ---");

                theList.displayList();

                theList.deleteFirst();   

                theList.deleteDedecate(new LinkNode(33,33.33));

                System.out.println("After delete  ---");

                theList.displayList();  

                LinkNode node = theList.find(new LinkNode(22,22.22));

                if(node!=null){

                    System.out.println("Find the following one :"+node.iData +"   "+node.dData);

                }

    }

}

 5 双端链表的应用 实现队列Queue

5.1 队列

first in first out(先进先出)

public interface Queue {

//队列尾部插入一个新的元素

    public void insert(LinkNode node);

    //队列头部删除一个元素

    public Object remove();

    //查询队列头部(最前端)的一个元素

    public Object peekFront();

    public void display();

}
/*用双端链表实现队列  */

public class LinkQueue implements Queue{

    private FirstLastList theList;

    public LinkQueue(){

        theList = new FirstLastList();

    }

    public boolean isEmpty(){

        return theList.isEmpty();

    }

 

    public void insert(LinkNode node){

        theList.insertLast(node.iData, node.dData);

    }

    public LinkNode remove(){

        LinkNode node = theList.deleteFirst();

        return node;

    }

    public void display(){

        theList.displayList();

    }
public class LinkQueueApp {

    public static void main(String[] args) {

        LinkQueue que = new LinkQueue();

        que.insert(new LinkNode(10,10.10));

        que.insert(new LinkNode(20,20.20));

        que.insert(new LinkNode(30,30.30));

        que.insert(new LinkNode(40,40.40));

        que.insert(new LinkNode(50,50.50));

        

        que.display();

        System.out.println("Insert has been done  ");

        

        que.remove(); 

        que.display();

        System.out.println("Remove has been done  ");

    }

}

 

6 双端链表特点

6.1 尾部插入新节点 -- > 可以实现队列

7  双端链表缺陷

FirstLastList保存对最后一个节点的引用,不能有助于删除最后一个链结点.因为没有一个引用指向倒数第二个链结点.

===>双向链表可以轻易做到这一点.

你可能感兴趣的:(链表)