1. 程式人生 > >單向連結串列的簡單Java實現-sunziren

單向連結串列的簡單Java實現-sunziren

  寫在前面,csdn的那篇同名部落格就是我寫的,我把它現在在這邊重新發布,因為我實在不想用csdn了,那邊的廣告太多了,還有就是那個噁心人的“閱讀更多”按鈕,惹不起我躲得起。


  最近面試的過程中,發現有的公司的面試題考到了連結串列的逆序,這一塊我正好不是特別清楚。於是打算把連結串列這一塊好好的學習學習。在網上搜尋了眾多的資料以後,瞭解到連結串列的核心是節點與節點之間的互相連結。

  於是自己也寫了一個單向連結串列的類,裡面包括input插入方法,inputById按指定下標插入方法,deleteAll刪除所有節點方法,deleteById按指定下標刪除結點方法,showAll控制檯檢視所有元素方法,reverse反轉當前連結串列方法,length獲取當前連結串列長度方法,等基本方法。

  需要說明的是,這個類還有很多不足之處,它還有很多需要改進的地方。但是基本原理和單向連結串列是相同的,僅供參考。

  1 package demo_4;
  2  
  3 import java.util.Stack;
  4  
  5 public class MyList<Re_Helix> {
  6     //節點內部類;
  7     private class Node{
  8         private Re_Helix data;            //資料;
  9         private Node next = null;            //
下個節點的引用; 10 11 public Node() { //節點的無參構造; 12 super(); 13 } 14 15 public Node(Re_Helix data) { //節點的有參構造; 16 super(); 17 this.data = data; 18 } 19 } 20 21 private Node head; //
頭部節點; 22 private Node end; //尾部節點; 23 private Node point; //臨時節點; 24 private int length; //長度屬性; 25 26 public MyList() { //連結串列的無參構造; 27 head = new Node(); 28 end = head; 29 length = 0; 30 } 31 32 public void input(Re_Helix data) { //給連結串列插入新值; 33 point = new Node(data); 34 if(length==0) { 35 end.data = point.data; 36 }else { 37 end.next = point; 38 end = point; 39 } 40 length++; 41 } 42 43 public void inputById(int target,Re_Helix data) { //在指定下標的位置插入新值,如果兩端超出範圍,則分別按照head和end處理; 44 Node temp = new Node(data); 45 if(target>=length) { 46 end.next = temp; 47 end = temp; 48 }else if(target<=0) { 49 temp.next = head; 50 head = temp; 51 }else { 52 temp.next = packPoint(target); 53 packPoint(target-1).next = temp; 54 } 55 length++; 56 } 57 58 public int length() { //返回連結串列的長度; 59 return length; 60 } 61 62 public Re_Helix getById(int target) { //輸入下標返回值; 63 return packPoint(target).data; 64 } 65 66 public void showAll() { //在控制檯檢視當前連結串列中的所有資料 67 point = head; 68 int i = 0; 69 while(point!=null) { 70 System.out.println("第"+(i++)+"個:"+point.data); 71 point = point.next; 72 } 73 } 74 75 public void reverse() { //將連結串列反轉; 76 Stack<Node> s1 = new Stack<Node>(); //利用佇列的先進先出的特性; 77 point = head; 78 while(point!=null) { 79 s1.push(point); 80 point = point.next; 81 } 82 head = s1.pop(); 83 point = head; 84 while(!s1.isEmpty()) { 85 point.next = s1.pop(); 86 point = point.next; 87 } 88 end = point; 89 end.next = null; //要將逆序後的end位置節點的next置空,不然會造成最後兩位的迴圈; 90 } 91 92 public void deleteById(int target) { //輸入下標刪除值 93 if(target>0) { 94 packPoint(target-1).next = packPoint(target).next; 95 }else { 96 head = head.next; 97 } 98 length--; 99 } 100 101 public void deleteAll() { //清空連結串列; 102 length = 0; 103 head.data = null; 104 head.next = null; 105 point = null; 106 end = head; 107 System.gc(); 108 } 109 110 public boolean editById(int target,Re_Helix data) { //修改傳入下標位置的值; 111 if(target<0 || target>length) { 112 return false; 113 }else { 114 packPoint(target).data = data; 115 return true; 116 } 117 } 118 119 private Node packPoint(int target) { //內部方法,將指標指向指定下標的節點; 120 if(target<=0) { 121 point = head; 122 }else if(target>=length) { 123 point = end; 124 }else { 125 int i = 0; 126 point = head; 127 while(i++!=target) { 128 point = point.next; 129 } 130 } 131 return point; 132 } 133 }

  多有不足,歡迎評論區批評指正。