由於本人就是學生物類專業的,今天突然想到用生物學上的多肽鏈合成可以來形象的理解鏈表。。高中的生物學知識就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
}