链表的实现与数组
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。
链表与数组的区别在于数组的内存分配是连续的(即数组的每一项内存地址是连续的),而链表则可能连续也可能不连续。
从性能上看,数组支持随机存储,查询速度相对于链表更快,但每一次插入或删除都要将操作数组项后面的元素逐一向前移动一位,效率为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。
相关文章推荐
- 分割字符串的一个demo
- myeclipse提交到github出现错误 non-fast-forward
- [memory]虚拟地址空间分布
- 软键盘弹出挤压界面的问题
- 简述Linux命令初使用
- BZOJ4008 [HNOI2015]亚瑟王
- 买酒
- springmvc学习
- HBase Java API类介绍
- 简单的redis 性能测试
- eclipse下的插件添加
- android studio快捷键
- 健康是美的基础
- 让所有习惯黑暗的眼睛,都习惯光明。——顾城
- 深入解析Python设计模式编程中建造者模式的使用
- WEB安全之Token浅谈
- 使用adb命令查看apk包名信息
- 在代码中将TextView的文字颜色改为自己写的color.xml文件设置的颜色
- git图解原理
- PEB进程环境块分析研究