Java单向链表操作详解

转自:http://blog.csdn.net/zxman660/article/details/7786354

——————————————————————————————————————————

  1.  /* 先定义一个Node类用来存储节点的值域和指针域 
  2.  * 即当前节点中的值和后面节点的方法 
  3.  * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 
  4.  */  
  5. class LNode{//这个写法已经非常固定了 设置两个属性分别用set函数和get函数来得到这两个属性   
  6.     private int data;  
  7.     private LNode next;//这个和String应该比较相似的用法,类名用来表示数据类型,表示next的数据类型也是节点   
  8.     public void setData(int data){  
  9.         this.data = data;  
  10.     }  
  11.     public int getData(){  
  12.         return this.data ;  
  13.     }  
  14.     public void setNext(LNode next){  
  15.         this.next = next;  
  16.     }  
  17.     public LNode getNext(){  
  18.         return this.next;  
  19.     }  
  20. }  
  21. /* 
  22.  * 定义一个链表主类,并且定义各种对链表操作的方法 
  23.  */  
  24. public class Linklist {  
  25.       
  26.          public LNode head;//定义一个头结点   
  27.   
  28. /* 
  29.  * 定义一个创建链表的方法 
  30.  * 该方法称之为 :尾插法:新产生的节点从尾部插入链表 
  31.  */  
  32.          public void createlink(int [] a){  
  33.            LNode pnew;//定义pnew表示新产生的结点   
  34.            LNode ptail=new LNode();//为尾节点分配堆内存   
  35.            head=ptail;//初始时是头结点与尾节点相等   
  36.            for(int i=0;i<a.length;i++){  
  37.            pnew=new LNode();//为新产生的节点分配堆内存   
  38.            pnew.setData(a[i]);//传递data值   
  39.            ptail.setNext(pnew);//把新产生的节点设置为ptail的后继节点   
  40.            pnew.setNext(null);//把新产生的节点的后继节点设为空   
  41.            ptail=pnew;//移动 ptail节点的位置使之一直指向尾部   
  42.            }  
  43.          }  
  44.    
  45. /* 
  46.  * 定义判断链表中元素是否存在的方法 
  47.  */  
  48.          public void seachlink(int value){  
  49.              LNode ptr;  
  50.               ptr=head.getNext();  
  51.               while(ptr!=null){//在节点非空的情况下寻找匹配的的值   
  52.                if(value==ptr.getData()){//匹配成功是   
  53.                 System.out.println("找到数据:"+ptr.getData());  
  54.                 break;//退出循环   
  55.                }  
  56.                else{//当当前值不是要查找的值时,查找下一个   
  57.                 ptr=ptr.getNext();  
  58.                }   
  59.               }  
  60.               if(ptr==null)//链表遍历完毕,没有找到时   
  61.                System.out.println("链表中没有要查找数据");  
  62.              }  
  63. /* 
  64.  * 定义一个删除节点的方法 
  65.  */  
  66.          public void deletelink(int value){  
  67.               LNode ptr;  
  68.               LNode p;  
  69.               p=head;  
  70.               ptr=head.getNext();  
  71.               while(ptr!=null){  
  72.                if(value==ptr.getData()){//判断链表中的当前值是否是要删除的节点   
  73.                 p.setNext(ptr.getNext());//把ptr的后继节点设置为p的后继节点,即在形式上在链表中删除了ptr节点   
  74.                // System.gc();   
  75.                 System.out.println("删除数据"+value+"成功!");  
  76.                 break;  
  77.                }  
  78.                else{  
  79.                 p=ptr;//p指向ptr位置   
  80.                 ptr=ptr.getNext();//ptr指向其直接后继位置   
  81.                }  
  82.               }  
  83.               if(ptr==null)  
  84.                System.out.println("链表中没有要删除的数据!");  
  85.              }  
  86. /* 
  87.  * 定义插入节点的方法 
  88.  */  
  89.      public void insertlink(int pos,int value){//两个参数,一个表示插入的位置,另一个表示插入的值   
  90.               LNode ptr;  
  91.               LNode pnew;//实例化新节点   
  92.               ptr=head.getNext();  
  93.               while(ptr!=null){  
  94.                if(pos==ptr.getData()){  
  95.                 pnew=new LNode();  
  96.                 pnew.setData(value);  
  97.                 pnew.setNext(ptr.getNext());  
  98.                 ptr.setNext(pnew);//   
  99.                 System.out.println("插入数据"+value+"成功!");  
  100.                 break;  
  101.                }  
  102.                else{  
  103.                 ptr=ptr.getNext();  
  104.                }  
  105.               }  
  106.               if(ptr==null)  
  107.                System.out.println("插入数据失败!");  
  108.              }  
  109.   
  110.            
  111.            
  112. /* 
  113.  * 定义一个输出链表内容方法 
  114.  */  
  115.          public void printlink(){  
  116.           LNode ptr;//实例化一个节点   
  117.           ptr=head.getNext();//该节点取得头结点的后继节点   
  118.           while(ptr!=null){  
  119.            System.out.print(ptr.getData()+"->");  
  120.            ptr=ptr.getNext();  
  121.           }  
  122.           System.out.println(" NULL");  
  123.          }  
  124.           
  125. /* 
  126.  * 下面给出一个测试用例,用数组创建一个整型的链表,并且把它输出         
  127.  */  
  128.      public static void main(String args[]){  
  129.        int a[]=new int [10];  
  130.        for(int i=0;i<a.length;i++){  
  131.        a[i]=i;  
  132.        }  
  133.        Linklist list=new Linklist();  
  134.        list.createlink(a);  
  135.        System.out.println(" 链表输出如下:");  
  136.        list.printlink();  
  137.        System.out.println(" 插入元素后链表的输出如下:");  
  138.        list.printlink();  
  139.          
  140.        }  
  141. }  

 

posted on 2014-09-16 13:35  凯撒帝  阅读(242)  评论(0编辑  收藏  举报

导航