Java學習小技巧,巧妙實現sunziren的單向鏈表

Java學習小技巧,巧妙實現sunziren的單向鏈表

  最近面試的過程中,發現有的公司的面試題考到了鏈表的逆序,這一塊我正好不是特別清楚。於是打算把鏈表這一塊好好的學習學習。在網上搜尋了衆多的資料以後,瞭解到鏈表的核心是節點與節點之間的互相鏈接。
  於是自己也寫了一個單向鏈表的類,裏面包括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 }

文章來自:https://www.itjmd.com/news/show-5345.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章