链表的理解

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表有一个“头指针”变量,以 head表示,它存放一个地址,该地址指向链表中第一个结点,第一个结点又指向第二个结点……直到最后一个结点。该结点不再指向其他结点,它称为“表尾”,它的地址部分存放一个“NULL”(表示“空地址”),链表到此结束。链表中每个结点都包括两个部分:用户需要用的实际数据和下一个结点的地址。
链表的一个重要特点是插入、删除操作灵活方便,不需移动结点,只需改变结点中指针域的值即可。而数组由于用存储单元的邻接性体现数组中元素的逻辑顺序关系,因此对数组进行插入和删除运算时,可能需要移动大量的元素,以保持这种物理和逻辑的一致性。如数组中有m个元素,往第i(i<m)个元素后面插入一个新元素,需要将第i+1个元素至第m个元素共m-i个元素向后移动。
public class LinkNode {
private Object obj;//节点内的数据对象
private LinkNode child;//下一个节点的引用
private LinkNode parent;//上一个节点的引用
public LinkNode (Object obj){
this.obj=obj;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public LinkNode getChild() {
return child;
}
public void setChild(LinkNode child) {
this.child = child;
}
public LinkNode getParent() {
return parent;
}
public void setParent(LinkNode parent) {
this.parent = parent;
}

}
----------------------------------------------------------------------
public class Linklist {
public static LinkNode front = null;//第一个节点
public LinkNode last =null;//最后一个节点
public static void main(String arg[]){
Linklist list =new Linklist();
//创建链表
LinkNode root =list.createLink();
list.add("6节点");
list.add(3,"插入节点1");
list.add(0,"插入节点2");
list.add(list.getlength(),"插入节点3");
// list.add(12,"插入节点4");
//遍历
list.printLinkList(list.front);
}
//
//手工创建双链表
public LinkNode createLink(){
//创建一个节点对象,并令其为第一个节点
front = new LinkNode("1节点");
LinkNode n2=new LinkNode("2节点");
LinkNode n3=new LinkNode("3节点");
LinkNode n4=new LinkNode("4节点");
last = new LinkNode("5节点");
front.setParent(null);
front.setChild(n2);
n2.setParent(front);
n2.setChild(n3);
n3.setParent(n2);
n3.setChild(n4);
n4.setParent(n3);
n4.setChild(last);
last.setParent(n4);
last.setChild(null);
return front;
}
//链表长度
public int getlength(){
int cout=0;
if(front==null){
return cout;
}
LinkNode node =front.getChild();
while (node!=null){
cout++;
node=node.getChild();
}
return cout+1;
}
//添加节点
public void add(Object obj){
//创建一个新的节点
LinkNode node =new LinkNode(obj);
if(front==null){//如果链表为零
front=node;
last=front;
}else{
last.setChild(node);
node.setParent(last);
last=node;
}
}
//插入节点
public void add(int index ,Object obj){

if(this.getlength()<index||index<0){
throw new java.lang.RuntimeException(
"下标越界"+index+",size:"+this.getlength());
}else {
//创建一个新的节点
LinkNode node =new LinkNode(obj);
if(index==0){
node.setChild(front);
front.setParent(node);
front=node;
}else if(index==getlength()){
add(obj);
}else{
LinkNode newnode =front;
for(int i=1;i<index;i++){
newnode=newnode.getChild();
}
LinkNode n=newnode.getParent();
node.setParent(n);
n.setChild(node);
node.setChild(newnode);
newnode.setParent(node);
}

}

}
//遍历链表
public void printLinkList(LinkNode root){
if(root!=null){
System.out.println(root.getObj());
LinkNode temp=root.getChild();
printLinkList(temp);
}
}
}
----------------------------------------------------------------------结果:
插入节点2
1节点
2节点
插入节点1
3节点
4节点
5节点
6节点
插入节点3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值