單鏈表反轉
阿新 • • 發佈:2017-05-16
循環 col 過程 str oid public 技術 next() 臨時
dummy->2->1->3->4->5dummy->3->2->1->4->5dummy->4>-3->2->1->5dummy->5->4->3->2->1
1定義
單鏈表node的數據結構定義如下:
class Node { // 註:此處的兩個成員變量權限不能為private,因為private的權限是僅對本類訪問 int data;// 數據域 Node next;// 指針域 public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(intdata) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } }
2 方法1:就地反轉法
2.1 思路
把當前鏈表的下一個節點pCur插入到頭結點dummy的下一個節點中,就地反轉。
dummy->1->2->3->4->5的就地反轉過程:
2.2 解釋
1初始狀態
2 過程
pCur是需要反轉的節點。
- prev連接下一次需要反轉的節點
- 反轉節點pCur
- 糾正頭結點dummy的指向
- pCur指向下一次要反轉的節點
偽代碼
1 prev.next = pCur.next; 2 pCur.next = dummy.next; 3 dummy.next = pCur;4 pCur = prev.next;
3 循環條件
pCur is not null
2.3 代碼
// 1.就地反轉法 public Node reverseList1(Node head) { if (head == null) return head; Node dummy = new Node(-1); dummy.next = head; Node prev = dummy.next; Node pCur = prev.next; while (pCur != null) { prev.next = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = prev.next; } return dummy.next; }
2.4 總結
- 1個頭結點,2個指針,4行代碼
- 註意初始狀態和結束狀態,體會中間的圖解過程。
3 方法2:新建鏈表,頭節點插入法
3.1 思路
新建一個頭結點,遍歷原鏈表,把每個節點用頭結點插入到新建鏈表中。最後,新建的鏈表就是反轉後的鏈表。
3.2 解釋
1 初始狀態
2 過程
pCur是要插入到新鏈表的節點。
pNex是臨時保存的pCur的next。
- pNex保存下一次要插入的節點
- 把pCur插入到dummy中
- 糾正頭結點dummy的指向
- pCur指向下一次要插入的節點
偽代碼
1 pNex = pCur.next 2 pCur.next = dummy.next 3 dummy.next = pCur 4 pCur = pNex
3 循環條件
pCur is not null
3.3 代碼
// 2.新建鏈表,頭節點插入法 public Node reverseList2(Node head) { Node dummy = new Node(-1); Node pCur = head; while (pCur != null) { Node pNex = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = pNex; } return dummy.next; }
3.4 總結
- 1個頭結點,2個指針(包含一個臨時保存節點的pNex),4行代碼
- 註意初始狀態和結束狀態,體會中間的圖解過程。
測試代碼:
LinkList list4 = new LinkList(); for (int i = 5; i < 10; i++) { list4.add(i); } LinkList list5 = new LinkList(); list5.head = list4.reverseList2(list4.head); System.out.print("反轉後的鏈表為:"); System.out.print("\r\n"); list5.print(list5.head);// 從head節點開始遍歷輸出
結果:
反轉後的鏈表為:
9
8
7
6
5
單鏈表反轉