java链表简单介绍

[size=large]

链表是一种物理存储单元上非连续、非顺序的存储结构;数据之间的逻辑顺序是靠链表中的指针来实现的。而链表本身由结点组成、结点可以在运动时动态生成;
结点:由数据域和指针域组成。

链表分为单向链表和双向链表


单向链表:每个结点由存储数据元素的数据域和指向下一结点的指针域组成。
例:单链表的结点结构
[/size]

/**
* @param 单链表结点类
*/
//节点类的数据对象
private Object obj;
//对下一节点的引用
private LinkNode next;
//在创建节点对象时就传入节点中的数据对象
public LinkNode(Object obj){
this.obj=obj;
}

public Object getObj(){
return obj;
}

public void setObj(Object obj){
this.obj=obj;
}

public LinkNode getNext(){
return next;
}

public void setNext(LinkNode next){
this.next=next;
}


[size=large]
而双向链表是单向链表的改进、因为在单向链表中,我们只能从前往后使用,不能从后往前使用;所以双向链表中、我们在结点中可以增加一个指向前结点的指针;这样,我们就可以随便地使用链表中的数据了。
结点表示:
[/size]


private Object obj;
//对下一节点的引用
private DoubleLinkNode child;
//对上一节点的插入
private DoubleLinkNode parent;
//在创建节点对象时就传入节点中的数据对象
public DoubleLinkNode(Object obj){
this.obj=obj;
}

public Object getObj(){
return obj;
}

public void setObj(Object obj){
this.obj=obj;
}

public DoubleLinkNode getChild(){
return child;
}

public void setChild(DoubleLinkNode child){
this.child=child;
}

public DoubleLinkNode getParent(){
return parent;
}

public void setParent(DoubleLinkNode parent){
this.parent=parent;
}


[size=large]
链表的使用:
链表最基本的使用就是实现查找、插入、删除、合并、排序、统计、或简单的计算。

其链表的插入:

[/size]

/**
* 在指定地点插入节点
*
* @param Index
* @param obj
*/
public void insertIndexObj(int index, Object obj) {
// 判断插入的位置是否正确
if (this.getLength() < index || index < 0) {
// 抛出异常
throw new java.lang.RuntimeException("下标越界" + index + "链表大小:"
+ this.getLength());
} else {
// 创建一个新的节点
DoubleLinkNode newNode = new DoubleLinkNode(obj);
// 调用方法,得到当前索引位置的结点
DoubleLinkNode node = this.getLinkNode(index);
// 插入操作前进行判断是否为空链表
if (index == 0) {
// 将头节点指向新节点
front = newNode;
} else {
// 插入时,先得到其索引值位置的父节点
DoubleLinkNode fNode = node.getParent();
// 将新节点的上节点指针指向fNode
newNode.setParent(fNode);
// 将fNode节点的子节点指向新节点
fNode.setChild(newNode);
}
// 将新节点的子节点指向当前索引值位置的节点
newNode.setChild(node);
// 将索引位置的节点的父节点指向新节点
node.setParent(newNode);
}
}

[size=large]
如得到链表的长度:
[/size]

/**
* 得到链表的长度
*
* @return
*/
public int getLength() {
int count = 0;
if (null == front) {
return count;
}
DoubleLinkNode node = front.getChild();
// 遍历链表
while (null != node) {
count++;
node = node.getChild();
}
return count + 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值