[size=large]链表[/size] [size=medium]1.链表一种物理存储单元上非连续,非顺序的存储结构,但它里面的数据元素的逻辑顺序靠每个节点的指针连接起来,其基本单元就是一个个节点,跟链条靠链销连接差不多。
2.链表分为单向链表和双向链表及循环链表,它们结构如下:[/size]
[img]http://dl2.iteye.com/upload/attachment/0095/2092/c1f8ce00-7ef5-3011-ae5c-bb97419282b0.png[/img]
[size=medium]由图可:单向链表便于形式简单,插入新节点,遍历不会进入死循环,双向链表便于找到前驱和后继,但建立起来稍微复杂一点,循环链表则相当于一个圆圈,任何节点都可以做头,这样容易遍历进入死循环。
链表和数组的区别:数组存储结构物理空间上连续,存取速度快,效率高,但不便于插入和删除数据,长度固定(不过动态数组可以弥补这缺点)。而链表空间上不连续,却能便于频繁插入和删除,只是建立起来复杂。
3.下面是双向链表实现自定义队列的程序代码(主要是熟悉链表结构):
首先是链表基本单元结点类:[/size]
[size=medium]下面给出的是实现自定义队列的链表形式:[/size]
2.链表分为单向链表和双向链表及循环链表,它们结构如下:[/size]
[img]http://dl2.iteye.com/upload/attachment/0095/2092/c1f8ce00-7ef5-3011-ae5c-bb97419282b0.png[/img]
[size=medium]由图可:单向链表便于形式简单,插入新节点,遍历不会进入死循环,双向链表便于找到前驱和后继,但建立起来稍微复杂一点,循环链表则相当于一个圆圈,任何节点都可以做头,这样容易遍历进入死循环。
链表和数组的区别:数组存储结构物理空间上连续,存取速度快,效率高,但不便于插入和删除数据,长度固定(不过动态数组可以弥补这缺点)。而链表空间上不连续,却能便于频繁插入和删除,只是建立起来复杂。
3.下面是双向链表实现自定义队列的程序代码(主要是熟悉链表结构):
首先是链表基本单元结点类:[/size]
public class Linknode{
private Linknode parent;//父节点
private Linknode child;//子节点
private Object obj;//节点中的内容
//构造节点方法,内容为obj
public Linknode(Object obj){
this.obj=obj;
}
//给节点加子节点
public void setchild(Linknode child){
this.child=child;
}
//得到子节点
public Linknode getchild(){
return child;
}
//给节点加父节点
public void setparent(Linknode parent){
this.parent=parent;
}
//得到父节点
public Linknode getparent(){
return parent;
}
//给节点设定内容
public void setObjest(Object obj){
this.obj=obj;
}
//获取节点内容
public Object getObject(){
return obj;
}
}
[size=medium]下面给出的是实现自定义队列的链表形式:[/size]
public class Linklist {
private Linknode first;//首节点
private Linknode last;//尾节点
private int length;//链表长度
public static void main(String[] args) {
// TODO Auto-generated method stub
//新建链表对象
Linklist list =new Linklist();
//循环创建多个节点对象,依次加入链表中
for(int i=0;i<10;i++){
Linknode node=new Linknode("节点"+i);
list.add(node);
}
list.remove(9);//移除索引位置的节点
//再给链表加入一个节点,然后打印链表
Linknode node=new Linknode("add");
list.add(8,node);
list.print();
}
//给链表尾加一个节点
public void add(Linknode node){
if (length==0){
first=node;
last=node;
}
else{
last.setchild(node);
node.setparent(last);
last=node;
}
//链表添加节点后,要把长度加一
length++;
}
//链表大小
public int size(){
return length;
}
//得到索引位置节点
public Linknode get(int index){
if(index>=length||index<0){
//超出范围时,抛出错误
throw new java.lang.Error("超出范围");
}
Linknode temp=first;
for(int i=0;i<index;i++){
temp=temp.getchild();
}
//System.out.println("得到第"+index+"个节点"+temp.getObject());
return temp;
}
//移除某个节点
public void remove(int index){
if(index>=length||index<0){
throw new java.lang.Error("超出范围");
}
//得到索引位置节点
Linknode temp= this.get(index);
if(temp.getparent()==null){
first=temp.getchild();
last=last.getparent();
}
else{
if(temp.getchild()==null){
last=last.getparent();
}
else{
temp.getparent().setchild(temp.getchild());
temp.getchild().setparent(temp.getparent());
last=last.getparent();
}
}
length--;
}
//在某个位置插入一节点
public void add(int index,Linknode node){
if(index>=length||index<0){
throw new java.lang.Error("超出范围");
}
//得到索引位置节点
Linknode temp= this.get(index);
if(temp.getparent()==null){//如果插入位置在首位置
//Linknode temp_first=first;
first=node;
node.setchild(temp);
temp.setparent(node);
}
else{ //如果插入位置不在第一个
temp.getparent().setchild(node);
node.setparent(temp.getparent());
temp.setparent(node);
node.setchild(temp);
}
length++;
}
//打印内容
public void print(){
for(int i=0;i<length;i++){
System.out.println(this.get(i).getObject());
}
}
}