反轉鏈表算法Java實現
阿新 • • 發佈:2018-12-11
每次 記錄 .data == 返回 更多 前驅 算法 退出
之前遇到反轉鏈表的算法,比較晦澀難解,但其實挺簡單的。
目標:將一個順序鏈表反轉。
思路:用三個輔助節點,每次實現一個節點的指向反轉,即他的後繼變為他的前驅。
三個輔助節點: p q r 按順序分別指向 節點0,1,2, 然後一次次移動,指向1,2,3 ; 2,3,4......
算法分為三部分:
第一部分:初始化部分:
q是中心節點,是每次反轉的節點,於是q是由函數參數傳入的,前面的節點p一個是null,後面的節點r是q的後繼節點q.next
第二部分:循環部分
分為兩個操作:
1.反轉:q的後繼變為他的前驅: q.next = p
2.移動:pqr向後移動一位:p = q;
q = r;
r = r.next;
第三部分:尾部處理:
反轉最後一個節點,並返回
1 public Node inverse(Node q) {//q初始化為頭結點:一開始是: p=null,q=head r = head.next
2 //參考:https://blog.csdn.net/feliciafay/article/details/6841115
3 if (q == null) return null;//頭結點為null,退出
4 /**
5 * 初始化部分:p=null,q=head(由函數參數傳入) r = q.next
6 */
7 // 一開始是: p=null,q=head r = head.next
8 Node r = q.next; //r是記錄還有多少個節點,即p q r,如果r=null,表示後面已經沒有更多的節點了,初始化為第二個
9 Node p = null; //初始化為null
10 /**
11 * 循環部分: q反轉 + pqr整體移動。
12 */
13 while (r != null) { //當當前節點有後繼節點時
14 //反轉節點q. (註意:q 是中心節點)
15 q.next = p;//q的後繼節點指向他的父節點p
16 //p,q,r相繼往後移動
17 p = q; //p後移動一個節點,即指向後繼q
18 q = r; //q也往後移動一個節點,指向後繼r
19 r = r.next;//r移動到下一個節點
20 }
21 /**
22 * 尾部處理部分:q反轉
23 */
24 q.next = p;//由於r到了最後節點的空子節點後,p,q還未反轉,故將其反轉
25 return q;//返回新的頭結點,即原來的尾節點
26 }
1 //節點類
2 static class Node {//
3 Node next;
4 int data;
5
6 Node(int data) {
7 this.data = data;
8 }
9 }
2018-12-11 13:24:26 DuXia Library XT
反轉鏈表算法Java實現