1. 程式人生 > >反轉鏈表算法Java實現

反轉鏈表算法Java實現

每次 記錄 .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實現