链表是一种物理存储单元上非连续、非顺序的存储结构。
链表有一系列的结点组成,结点可以在运行是动态生成。
每一个结点包括两个部分:存储数据的数据域和存储下一个结点的指针域。
下面是结点的一个类,有设置和得到结点中数据的方法,设置和得到下一个结点的方法。
设置结点的数据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); }
结果如下: