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