链表小结

[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]


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());
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值