您的位置:首页 > 其它

链表的实现与数组

2016-03-02 11:00 162 查看
链表与数组是最基础的数据的结构,堆栈.队列等逻辑上的数据结构都是基于这两种数据结构实现的。

链表与数组的区别在于数组的内存分配是连续的(即数组的每一项内存地址是连续的),而链表则可能连续也可能不连续。

从性能上看,数组支持随机存储,查询速度相对于链表更快,但每一次插入或删除都要将操作数组项后面的元素逐一向前移动一位,效率为O(n)。而链表的查询每次都要从表头开始逐一查询,查询效率为O(n),查询速度相对数组更慢,但其插入删除速度由于只需要改变节点指针,所以操作速度更快。

链表节点

public class ListNode {

        String information;//当前存储信息
ListNode nextNode;//指向下一节点

}

链表基本操作的实现

public class LinkList {

private int length;//链表长度
ListNode firstNode;//链表首指针

//链表大小
public int size()
{
return length;
}

//删除末尾的元素
public void deleteLastNode(){
if(firstNode!=null){

//如果链表只有一个节点.让链表为空
if(firstNode.nextNode==null){
firstNode=null;
length--;
}

//否则前后指针交替指向最后两个节点,currentNode为空时,previousNode即为最后一个节点,令其为Null,即删除了最后一个节点
else{
ListNode currentNode;
ListNode previousNode;

//令两个指针分别指向链表的第一,第二个节点
previousNode=firstNode;
currentNode=firstNode.nextNode;

while(currentNode.nextNode!=null){
previousNode=currentNode;
currentNode =currentNode.nextNode;
}
previousNode.nextNode=null;
length--;
}
}
}
//查询某个节点
public ListNode searchListNode(String airportCode){
ListNode N =firstNode;
while(N!=null){
if(N.getAirportcode().equals(airportCode)){
return N;
}
else
N =N.nextNode;
}
return N;
}
//在末尾增加某个元素
public void insertLastNode(String airportCode){

ListNode temp=new ListNode();
temp.setAirportcode(airportCode);
temp.nextNode=null;
if(firstNode==null){
firstNode=temp;
}
else{
ListNode N=firstNode;
while(N.nextNode!=null){
N=N.nextNode;
}
N.nextNode=temp;
}
length++;
}

  //反转链表
public void reverse(){
ListNode new=null,L=null,old=null;//L为指针
L=firstNode;
if(firstNode==null)
return ;
else{
while(L!=null){
new=L;
L=L.nextNode;
new.nextNode=old;
old=new;
}
firstNode=old;
}
}

反转链表原理如图。

将1先存储在new节点里,然后指针指向下一个节点,这时再改变new节点,使其nextNode指向old(初始化为Null).将此时新节点new在存储在old节点里,如此循环,最后则完成了反转,最后将反转后的首节点(原来的尾节点)赋给头指针firstNode。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: