數據結構學習之用生物學理解鏈表結構

   由於本人就是學生物類專業的,今天突然想到用生物學上的多肽鏈合成可以來形象的理解鏈表。。高中的生物學知識就ok了。

一、構成鏈表的基礎結點 

   多肽鏈形成的基礎是氨基酸,這裏可以將氨基酸類比爲結點。氨基酸的氨基可以類比爲head 其羧基可以類比爲 tail(如下圖的左面可以類比head 右面可以類比 tail)    

     

形成鏈表的過程可以類比形成多肽的過程。

首先要有兩個結點(頭節點和尾結點) 相當於要有一個正常的氨基酸

public class MyLinkedList<E> extends MyAbstractList<E>{
    //結點類的實現 
    private static class MyNode<E> {
        E element;   
        MyNode<E> next;
        MyNode<E> prev;
        
        MyNode(E e){
        	element = e;
        }
        MyNode(MyNode<E> prev, E element, MyNode<E> next){
            this.element = element;     //
            this.next = next;
            this.prev = prev;
        }
    }

    //創建兩個結點頭節點和尾結點
    MyNode<E> head;
    MyNode<E> tail;

    public MyLinkedList(){
    }
    
    public MyLinkedList(E[] objects){
    	super(objects);
    }
    

}

二、一些功能

(一)addFirst(E e):

在第一個增加一個元素(即結點),相當於一個氨基酸的羥基要於已經存在的那個氨基酸的氨基相結合(如下圖)

這樣就形成了二肽。那麼怎麼實現這個

//代碼接上面一個的

public void addFrist(E e){
    //首先創建一個新的對象爲 e 的 node 對象
    MyNode<E> newNode = new MyNode<E>(e);
    if(head == null){     //這個不寫會有bug
        head = tail = newnode;
    }else{
        //此時新增的結點相當於新增的氨基酸爲了形成肽鍵它要找到“組織”
        //所以利用MyNode類中的next 將其 next 於已經存在的結點建立聯繫
        newNode.next = head;
        head = newNode;  //可以類比下新來的氨基酸的氨基取代了舊的氨基酸的氨基成爲了head
    }
    size++;    
}

(二)addLast(E e)

與addFrist的思維相似這裏直接放代碼了

public void addLast(E e){
    MyNode<E> newNode = new MyNode<E>(e);
    if(tail = null){
        head = tail = newnNode;
    }else{
        newNode.prev = tail;
        tail = newNode;
    }    
    size++;
}

(三)add(int index,E e)

這個有些難度,我想一想,在肽鍵合成的是(嗯生物學的不行)貌似有一種機制就是將一個肽鍵插入進去。相信有了之前的介紹大家應該有一個比較形象的認識。代碼如下

public void add(int index,E e){
    MyNode<E> newNode = new MyNode<E>(e);   //新建一個結點,相當於又來了一個氨基酸
    MyNode<E> current = head;        //之所以設置這個  current就相當於一個引子從頭一直到要插入的位置
    MyNode<E> temp;     
    
   if(index == 0) addFirst(e);
   else if(index >= size) addLast(e);
   else{
        while(index-- > 1){
        current = test.next            //到達插入的位置
        }
    
        temp = current.next;            //進行插入
        current.next = newNode;
        newNode.next = temp;
   }  
    
    size++;
}

(三)removeFrist()和removeLast()

使第一肽鍵斷裂就ok了,不需要管斷開的了那個氨基酸隨它飄到哪裏,肽鍵的斷裂也就相當與 之前第二個氨基酸的氨基當了頭

public E removeFrist(){   
    E element = head;                
                             
    head = head.next;
    size--;
    return element;
}

public E removeLast(){
    E element = tail;
    tail = tail.prev;
    size--;
    return element;
}    

(四)remove(int index)

移去特定位置上的元素與add(int index)思維相似,這裏直接寫代碼

public E remove(int index){
    MyNode current = head;
    MyNode temp;
    if(index < 0|| index >= size) return null;
    else if(index == 0) return removeFirst();
    else{
        while(index-- >= 1){
            current = current.next;
        }
        temp = current;    
        (current.prev).next = current.next;
        current = null;
    }
    size --;
    return temp.element;
}

 

  (五)   remove(E e)

public E remove(MyNode node){
    E temp = node.element;
    
    (node.prev).next = node.next;
    (node.next).prev = node.prev;
    node = null
    return temp;
}

 

(六)clear()

當沒有任何的氨基酸即 其氨基 羧基都不存在  也就是 head = tail = null 時候 那麼何談 多肽 

public void clear(){
    head = tail = null;
    size = 0
}

 

 

 

 

 

 

 

 

 

 

 

 

 

               

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章