一、双向链表
import android.util.Log;
/**
* Created by Xi on 2017/8/1.
* 双向链表中的结点
*/
public class LinkDouble {
public double dData;
public LinkDouble next;//下一个结点
public LinkDouble previous;//上一个结点
public LinkDouble(double dd){
dData=dd;
}
public void displayLink(){
Log.i("LinkDouble",dData+"");
}
}
import android.util.Log;
/**
* Created by Xi on 2017/8/1.
* 双向链表
*/
public class LinkListDouble {
private LinkDouble first;
private LinkDouble last;
public LinkListDouble(){
first=null;
last=null;
}
public boolean isEmpty(){
return first==null;
}
/**
* 从首插入一个结点
* @param dd
*/
public void insertFirst(double dd){
LinkDouble newLink=new LinkDouble(dd);
if(isEmpty()){
last=newLink;
}else{
first.previous=newLink;
}
newLink.next=first;
first=newLink;
}
/**
* 从尾插入一个结点
* @param dd
*/
public void insertLast(double dd){
LinkDouble newLink=new LinkDouble(dd);
if(isEmpty()){
first=newLink;
}else{
last.next=newLink;
newLink.previous=last;
}
last=newLink;
}
/**
* 删除第一个结点
* @return
*/
public LinkDouble deleteFirst(){
LinkDouble temp=first;
if(first.next==null){//删完以后,整个链表没有元素了
last=null;
}else{
first.next.previous=null;//将下一个元素的previous至为空,由于First元素以被删除
}
first=first.next;
return temp;
}
/**
* 删除最后一个结点
* @return
*/
public LinkDouble deleteLast(){
LinkDouble temp=last;
if(first.next==null){//删完以后,整个链表没有元素了
first=null;
}else{
last.previous.next=null;
}
last=last.previous;
return temp;
}
/**
* 插入到指定项的后面
* kk即为要找的数据项,dd就插在它的后面
* 正常情况下需要修改四个引用,及新插入结点的previous、next,新结点的上一个结点的next,新结点下一个结点的previous
* @return
*/
public boolean insertAfter(double key,double dd){
LinkDouble current=first;
while(current.dData!=key){
current=current.next;
if(current==null){
return false;//退出方法,插入失败
}
}
LinkDouble newLink=new LinkDouble(dd);
if(current==last){
newLink.next=null;
last=newLink;
}else{
newLink.next=current.next;//修改新插入结点的next引用
current.next.previous=newLink;//修改新插入结点下一个结点的previous引用
}
newLink.previous=current;//修改新插入结点的previous引用
current.next=newLink;//修改新插入结点上一个结点的next引用。
return true;
}
/**
* 删除链表的指定项
*/
public LinkDouble deleteKey(double key){
LinkDouble current=first;
while(current.dData!=key){
current=current.next;
if(current==null){
return null;//没有找到,退出方法
}
}
if(current==first){//如果被删除的结点是第一个
first=current.next;
}else{
current.previous.next=current.next;
}
if(current==last){//如果被删除的结点是最后一个
last=current.previous;
}else{
current.next.previous=current.previous;
}
return current;
}
/**
* 从前向后显示
*/
public void displayFroward(){
Log.v("LinkListDouble","list(first-->last):");
LinkDouble current=first;
while(current!=null){
current.displayLink();
current=current.next;
}
}
/**
* 从后向前显示
*/
public void displayBackword(){
Log.v("LinkListDouble","list(last-->first):");
LinkDouble current=last;
while(current!=null){
current.displayLink();
current=current.previous;
}
}
}
二、调用函数如下
/**
* 双向链表
*/
private void link_double(){
LinkListDouble theLink=new LinkListDouble();
theLink.insertFirst(22);
theLink.insertFirst(33);
theLink.insertFirst(44);
theLink.insertLast(55);
theLink.insertLast(66);
theLink.insertLast(77);
theLink.displayFroward();
theLink.displayBackword();
theLink.deleteFirst();
theLink.displayFroward();
theLink.deleteLast();
theLink.displayFroward();
theLink.deleteKey(55);
theLink.displayFroward();
}
日志打印如下:
08-15 10:13:08.722 16378-16378/com.tool.wpn.quicksort V/LinkListDouble: list(first-->last):
08-15 10:13:08.722 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 44.0
08-15 10:13:08.725 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 33.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 22.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 55.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 66.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 77.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort V/LinkListDouble: list(last-->first):
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 77.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 66.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 55.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 22.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 33.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 44.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort V/LinkListDouble: list(first-->last):
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 33.0
08-15 10:13:08.727 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 22.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 55.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 66.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 77.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort V/LinkListDouble: list(first-->last):
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 33.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 22.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 55.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 66.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort V/LinkListDouble: list(first-->last):
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 33.0
08-15 10:13:08.730 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 22.0
08-15 10:13:08.732 16378-16378/com.tool.wpn.quicksort I/LinkDouble: 66.0
源码下载地址:点击打开链接