首先在说下单链表,才能和双链表作比较
单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一个结点的head指向为null,这样一来就连成了上述所说绳子一样的链,对单链表的操作只能从一端开始,如果需要查找链表中的某一个结点,则需要从头开始进行遍历。
添加:上图可以看出 单向链表只有一个指向,原来head为p,p指向s,添加结点只需要把p指向q,q指向s就可以了,即:p--->q ; q--->s ; 这样就实现了单向链表的添加
删除:原理与添加相反,若此时链表为 p---> q --->s ; 若删除q节点只需要更改p的指向就可以了 p--->s,这样就删掉了;
查找:查找操作需要对整个但链表进行遍历,直到满足查找条件为止;
双向链表:
双链表(双向链表):双链表和单链表相比,多了一个指向尾指针(tail),双链表的每个结点都有一个头指针head和尾指针tail,双链表相比单链表更容易操作,双链表结点的首结点的head指向为null,tail指向下一个节点的tail;尾结点的head指向前一个结点的head,tail 指向为null,是双向的关系;
代码:public class LinKList{
Node head;
Node tail;
int count;
public LinkList(Node node,Node tail,int count){
this.head = null;
this.tail = null;
this.count = 0;
}
public LinkList(){
}
//头插法添加节点
public vois addHeadNode(NodeData data){
Node node = new Node(data,null,null);
if(head == null && tail ==null){
head = node;
head.setFront(null);
tail = node;
tail.setNext(null);
}else{
head.setFront(node);
node.setNext(head)
head = node;
head.setFront(null);
}
}
//尾插法添加节点
public void addTailNode(NodeData data){
Node node = new Node(data,null,null);
if(head==null&&tail==null){
head=node;
head.setFront(null);
tail=node;
tail.setNext(null);
}else{
tail.setNext(node);
node.setFront(tail);
tail=node;
tail.setNext(null);
}
count++;
}
//查找节点
public Node findNode(NodeData data){
Node temp =head;
if(head != null ){
while (temp != null ){
if(temp.data.compare(data)){
return temp;
}
temp =temp.getNext();
}
}
return null ;
}
//删除节点
public void delNode(NodeData data){
Node temp =findNode(data);
if(temp != null){
if(temp.getFront() ==null){
head = temp.getNext();
head.setFront(null);
}else if(temp.getNext()==null){
//说明是尾结点
tail= temp.getFront();
tail.setNext(null);
}else{
temp.getFront().setNext(temp.getNext());
temp.getNext().setFront(temp.getFront())
}
}
}
}