Java单链表(个人小结)

Java单链表(个人总结)
   第三篇技术博客  相当的不好意思 还是没培养成写博客的习惯 看了看上一篇的时间3月13 很多感触 晚点另写一篇总结吧……
   这个总结有点相当的过时了 上周就做好了但是一直没细想 现在由于学校课程正在用C实现中 思想相通 姑且把java版本的总结如下
   用链表实现队列,首先思考的就是队列的常见功能:插入,添加,删除,索引查找,遍历打印,长度统计,修改.
   然后就是思考如何用链表表示,链表的结构特点便是前后相连,与数组这些顺序结构相比,链表特点便是所存取的部分在内存中不连续,前一个元素对象指向下一个,这种指向关系,在C中是指针,在Java中便是引用传递,我觉得区别C与java的也就在这里。(C学的很烂,指针始终没弄明白,也没回头看,不过学JAVA时定义结点类时看到在一个结点类中定义下一个结点为属性,忽然一下就有种懂了的感觉,呵呵),所以对队列的操作便是对这些结点的各种操作,改变结点的属性。
   具体实现代码如下;
   首先是必须要定义好结点类滴:
   public class LinkNode {
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;
}
}
        四个方法,两个属性。
        然后就可以写队列类的方法了:
        首先定义两个结点:
         private   LinkNode root=null;
private   LinkNode rear=root;
         root是根节点,rear是当前结点
         队列相应的操作方法就如下了:
         //添加元素的方法
          public void add(Object obj){//添加元素
    LinkNode node=new LinkNode(obj);
    if(root==null){
    root=node;
    rear=root;
    }else{
    rear.setNext(node);
    rear=node;
    }
      }
         //删除指定元素
          public void remove(int index){
      int count=0;
      rear=root;
      if(index==0){
  root=root.getNext();
  }
      while(rear!=null&&rear.getNext()!=null){   
      if(count==index-1){
      rear.setNext(rear.getNext().getNext());
      }
      count++;
      rear=rear.getNext();
      }   
      }
        //返回队列长度
       public int size(){
      int count=0;
      if(root==null){
      return 0;
      }else{
      count++;
      rear=root.getNext();
      while(rear!=null){
      count++;
      rear=rear.getNext();            
      }         
      }
      return count;
      }
         //返回指定元素
  public Object get(int index){
    int count=0;
    if(index<0||index>=size()){
    throw new RuntimeException();
    }
    else{
    rear=root;
    while(rear!=null){   
    if(count==index){
    return rear.getObj();
    }
    else{
    count++;
    rear=rear.getNext();
    }   
    }      
    }
    return null;    
      }
      //指定位置插入元素
  //此处是用后插法
      public void insert(int index,Object obj){
      int count=0;
      rear=root;
      LinkNode node=new LinkNode(obj);
      while(rear!=null&&rear.getNext()!=null){
      if(count==index){
   
      node.setNext(rear.getNext());
      rear.setNext(node);
      }
      count++;
      rear=rear.getNext();
      }
      if(rear!=null&&rear.getNext()==null){
      if(count==index){
      rear.setNext(node);
      }
      }           
      }

      //修改指定元素
  public void modify(int index,Object obj){
      int count=0;
      if(index<0||index>=size()){
      throw new RuntimeException();
      }
      else{
      rear=root;
      while(rear!=null){   
      if(count==index){     
          rear.setObj(obj);         
      //    break;
      }     
      count++;
      rear=rear.getNext();         
      }      
      }
      } 
      //打印整个队列
public void printLinkList(){
      rear=root;
       while(rear!=null){
       Object obj=rear.getObj();
          System.out.println(obj);
          rear=rear.getNext();               
        }
      }

       总体感觉,写的这些方法都很类似。都是要沿头结点向后查找,如果索引值与计数的count相等,则执行相应删除,修改或添加操作,重要的便是如何调用结点类的四个方法,尤其是后两个setNext()和getNext(),使链表始终保持连接而不中断……
     
       思路是第一位的,明确要实现的功能,再按难易和必要性分块,一步步实现,具体到代码就是分块的执行循环,赋值等基本操作,判断条件的选定,整体模块的调用,呵呵 这是最近写代码的感受  。
     还是要交流才能进步的快,写出来,感觉挺舒服,错误欢迎指正,感激不尽………嘿嘿 加油