链表是一种物理存储单元上非连续、非顺序的存储结构。
链表有一系列的结点组成,结点可以在运行是动态生成。
每一个结点包括两个部分:存储数据的数据域和存储下一个结点的指针域。
下面是结点的一个类,有设置和得到结点中数据的方法,设置和得到下一个结点的方法。
设置结点的数据setObject(Object obj)
得到结点的数据getObject()
设置下一个结点setNext(linkNode next)
得到下一个结点getNext()
public class linkNode {
Object obj;//结点中中的数据
linkNode next;//对下一个结点的引用
public linkNode(Object obj){
this.obj=obj;
}
public Object getObject(){
return obj;
}
public void setObj(Object obj){
this.obj=obj;
}
public void setNext(linkNode next){
this.next=next;
}
public linkNode getNext(){
return next;
}
}
结点的类设置好了后,还要添加结点,创建链表。
分链表为空和不为空两种情况:如果不为空,就将刚刚创建的结点作为根结点,并且该结点是尾结点,否则,将刚刚创建的结点作为尾结点。
linkNode root=null;//根结点
linkNode end=root;//尾结点
public void add(Object obj){
if(root==null){
root=new linkNode(obj);
end=root;
}else{
linkNode node=new linkNode(obj);
end.setNext(node);
end=node;
}
}
得到链表的大小。
如果链表为空,长度就为0,否则,见以下代码:
count++;
linkNode node=root.getNext();
while(node!=null){
count++;
node=node.getNext();
得到结点中存储的数据:
如果不在范围之内,抛出异常
if(index>=size()||index<0){
throw new RuntimeException("给定的值超出范围:index:"+index);
}
在范围之内,找到结点后调用getObject()方法,得到数据。
linkNode node=root.getNext();
while(node!=null){
n++;
if(index==n) return node.getObject();
node=node.getNext();
}
插入结点
如果是在根结点前插入结点
node.setNext(root);
root=node;
如果是在尾结点后插入结点
end.setNext(node);
在根结点之后和尾结点前插入结点
node1=root;
for(int i=0;i<n-1;i++){
node1=node1.getNext();
}
node.setNext(node1.getNext());
node1.setNext(node);
删除结点
删除根结点
node=root.getNext();
root=node;
删除尾结点
node=root;
for(int i=0;i<t-1;i++){
node=node.getNext();
}
end=node;
node1=node.getNext();
node1=null;
删除根结点之后尾结点之前的结点
node=root;
for(int i=0;i<n-1;i++){
node=node.getNext();
}
node1=node.getNext();
node.setNext(node1.getNext());
node1=null;
查询索引值为n的结点
linkNode node;
Object o = null;
node=root;
for(int i=0;i<size();i++ ){
if(i==n) o=node.getObject();
node=node.getNext();
}
return o;
修改结点n的数据为o
linkNode node;
if(n==0) root.setObj(o);
else{
node=root;
for(int i=0;i<n;i++ ){
node=node.getNext();
}
node.setObj(o);
}
结果如下: