数据结构学习之用生物学理解链表结构

   由于本人就是学生物类专业的,今天突然想到用生物学上的多肽链合成可以来形象的理解链表。。高中的生物学知识就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
}

 

 

 

 

 

 

 

 

 

 

 

 

 

               

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