Java单向链表操作详解


  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. public LNode head; //定义一个头结点
  26. /*
  27. * 定义一个创建链表的方法
  28. * 该方法称之为 :尾插法:新产生的节点从尾部插入链表
  29. */
  30. public void createlink(int [] a){
  31. LNode pnew; //定义pnew表示新产生的结点
  32. LNode ptail= new LNode(); //为尾节点分配堆内存
  33. head=ptail; //初始时是头结点与尾节点相等
  34. for( int i= 0;i<a.length;i++){
  35. pnew= new LNode(); //为新产生的节点分配堆内存
  36. pnew.setData(a[i]); //传递data值
  37. ptail.setNext(pnew); //把新产生的节点设置为ptail的后继节点
  38. pnew.setNext( null); //把新产生的节点的后继节点设为空
  39. ptail=pnew; //移动 ptail节点的位置使之一直指向尾部
  40. }
  41. }
  42. /*
  43. * 定义判断链表中元素是否存在的方法
  44. */
  45. public void seachlink(int value){
  46. LNode ptr;
  47. ptr=head.getNext();
  48. while(ptr!= null){ //在节点非空的情况下寻找匹配的的值
  49. if(value==ptr.getData()){ //匹配成功是
  50. System.out.println( "找到数据:"+ptr.getData());
  51. break; //退出循环
  52. }
  53. else{ //当当前值不是要查找的值时,查找下一个
  54. ptr=ptr.getNext();
  55. }
  56. }
  57. if(ptr== null) //链表遍历完毕,没有找到时
  58. System.out.println( "链表中没有要查找数据");
  59. }
  60. /*
  61. * 定义一个删除节点的方法
  62. */
  63. public void deletelink(int value){
  64. LNode ptr;
  65. LNode p;
  66. p=head;
  67. ptr=head.getNext();
  68. while(ptr!= null){
  69. if(value==ptr.getData()){ //判断链表中的当前值是否是要删除的节点
  70. p.setNext(ptr.getNext()); //把ptr的后继节点设置为p的后继节点,即在形式上在链表中删除了ptr节点
  71. // System.gc();
  72. System.out.println( "删除数据"+value+ "成功!");
  73. break;
  74. }
  75. else{
  76. p=ptr; //p指向ptr位置
  77. ptr=ptr.getNext(); //ptr指向其直接后继位置
  78. }
  79. }
  80. if(ptr== null)
  81. System.out.println( "链表中没有要删除的数据!");
  82. }
  83. /*
  84. * 定义插入节点的方法
  85. */
  86. public void insertlink(int pos,int value){ //两个参数,一个表示插入的位置,另一个表示插入的值
  87. LNode ptr;
  88. LNode pnew; //实例化新节点
  89. ptr=head.getNext();
  90. while(ptr!= null){
  91. if(pos==ptr.getData()){
  92. pnew= new LNode();
  93. pnew.setData(value);
  94. pnew.setNext(ptr.getNext());
  95. ptr.setNext(pnew); //
  96. System.out.println( "插入数据"+value+ "成功!");
  97. break;
  98. }
  99. else{
  100. ptr=ptr.getNext();
  101. }
  102. }
  103. if(ptr== null)
  104. System.out.println( "插入数据失败!");
  105. }
  106. /*
  107. * 定义一个输出链表内容方法
  108. */
  109. public void printlink(){
  110. LNode ptr; //实例化一个节点
  111. ptr=head.getNext(); //该节点取得头结点的后继节点
  112. while(ptr!= null){
  113. System.out.print(ptr.getData()+ "->");
  114. ptr=ptr.getNext();
  115. }
  116. System.out.println( " NULL");
  117. }
  118. /*
  119. * 下面给出一个测试用例,用数组创建一个整型的链表,并且把它输出
  120. */
  121. public static void main(String args[]){
  122. int a[]= new int [ 10];
  123. for( int i= 0;i<a.length;i++){
  124. a[i]=i;
  125. }
  126. Linklist list= new Linklist();
  127. list.createlink(a);
  128. System.out.println( " 链表输出如下:");
  129. list.printlink();
  130. System.out.println( " 插入元素后链表的输出如下:");
  131. list.printlink();
  132. }

注:原文地址https://blog.csdn.net/zxman660/article/details/7786354

猜你喜欢

转载自blog.csdn.net/u012501054/article/details/80943145
今日推荐