从单链表的特性可以看出,向链表中添加元素除了添加到第一个位置以外都必须遍历链表,如果要在链表的末尾添加一个元素则需要从第一个一次遍历到链表的最后一个元素才可以完成添加。当数据量比较大的时候向末尾添加元素的操作过于繁琐。于是双端链表出现了,他可以解决想单链表末尾添加元素操作繁琐的问题。
双端链表相比于单链表只是添加了一个指针指向链表的最后一个元素(区别于双向链表)。其他的操作和单链表一致。
java代码的实现:
public class FirstLastList {
Node firstNode;
Node lastNode;
public Node getFirstNode() {
return firstNode;
}
public void setFirstNode(Node firstNode) {
this.firstNode = firstNode;
}
public Node getLastNode() {
return lastNode;
}
public void setLastNode(Node lastNode) {
this.lastNode = lastNode;
}
public FirstLastList(){
firstNode = null;
lastNode = null;
}
public boolean isEmpty(){
return lastNode==null;
}
public void addFirst(String value){
Node node = new Node(value);
if(isEmpty()){
node.setNext(null);
lastNode = node;
firstNode = node;
}else {
node.setNext(firstNode);
firstNode = node;
}
}
public void delFirst(){
if(isEmpty()){
return;
}else {
if(firstNode.getNext()==null){
firstNode = lastNode = null;
}else {
firstNode = firstNode.getNext();
}
}
}
public void addLast(String value){
Node node = new Node(value);
if(isEmpty()){
node.setNext(null);
firstNode = lastNode = node;
}else {
lastNode.setNext(node);
lastNode = node;
}
}
public void show(){
if(isEmpty()){
return;
}else {
Node node = firstNode;
while(node!=null){
System.out.print(node.showValue()+" ");
node = node.getNext();
}
System.out.println();
}
}
}
测试代码:
FirstLastList fLastList = new FirstLastList();
for(int i =100;i<1000;i+=100){
fLastList.addFirst(i+"");
}
fLastList.show();
fLastList.addFirst(123+"");
fLastList.addFirst(456+"");
fLastList.show();
fLastList.addLast(654+"");
fLastList.addLast(321+"");
fLastList.show();
fLastList.delFirst();
fLastList.show();
fLastList.delFirst();
fLastList.show();
测试结果:
900 800 700 600 500 400 300 200 100
456 123 900 800 700 600 500 400 300 200 100
456 123 900 800 700 600 500 400 300 200 100 654 321
123 900 800 700 600 500 400 300 200 100 654 321
900 800 700 600 500 400 300 200 100 654 321
结论:
双端链表仅仅解决想单链表末尾添加元素的方法。