1. 程式人生 > >反轉連結串列演算法Java實現

反轉連結串列演算法Java實現

之前遇到反轉連結串列的演算法,比較晦澀難解,但其實挺簡單的。

目標:將一個順序連結串列反轉。

思路:用三個輔助節點,每次實現一個節點的指向反轉,即他的後繼變為他的前驅。

          三個輔助節點: 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