單向鏈表的簡單Java實現-sunziren
阿新 • • 發佈:2019-01-11
試題 隊列 tar 屬性 博客 查看 col 鏈表插入 del
寫在前面,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 }
多有不足,歡迎評論區批評指正。
單向鏈表的簡單Java實現-sunziren