1. 程式人生 > >演算法題009 -- [反轉單鏈表] by java

演算法題009 -- [反轉單鏈表] by java

題目

反轉單鏈表,可以使用迭代或者遞迴的方法

思路

具象化反轉單鏈:

反轉前:

在這裡插入圖片描述

反轉中:

在這裡插入圖片描述

反轉後:

在這裡插入圖片描述

    用文字來描述上圖的步驟: 1. 將V節點的next,指向上一個節點U 2. 在步驟1完成前,需要有一個區域性變數值記錄住W節點,否則W節點就會遺失 3. 最後指標指向W節點,繼續下一個節點的處理
以上就是每一個節點都需要做的事情了,不管是迭代的方法還是遞迴的方法都是這樣的步驟。 然而需要考慮的還不止這麼多,比如第一個節點的上一個節點的處理,以及方法結束時的返回值的處理。

程式碼

package algorithm9;

import algorithm6.ListNode;

public
class Algorithm9 { public static void main(String[] args) { ListNode test = getListNode1(); System.out.println(test.toString()); test = reverseListNode2(test, null); System.out.println(test.toString()); } /**方法一:迭代 * 注意點:tempNext == null 時,說明已經迭代到最後一個節點了,這時為headNode賦值 * @param listNode * @return */
public static ListNode reverseListNode(ListNode listNode) { ListNode pre = null; ListNode headNode = null; while(listNode != null) { ListNode tempNext = listNode.next; listNode.next = pre; pre = listNode; if(tempNext == null) headNode = listNode; listNode = tempNext; } return
headNode; } /**方法二:遞迴 * 注意點:listNode.next == null 時,說明已經迭代到最後一個節點了 * 與迭代方法不同的是,這裡沒有固定區域性變數來記錄頭結點,所以就需要將整個連結串列串成一個完整的連結串列 * @param listNode * @param pre * @return */ public static ListNode reverseListNode2(ListNode listNode, ListNode pre) { if(listNode.next == null) { listNode.next = pre; return listNode; } ListNode tempNext = listNode.next; listNode.next = pre; pre = listNode; listNode = tempNext; return reverseListNode2(listNode, pre); } public static ListNode getListNode1() { ListNode listNode2 = new ListNode(0); ListNode listNode4 = new ListNode(1); ListNode listNode6 = new ListNode(2); ListNode listNode8 = new ListNode(3); ListNode listNode10 = new ListNode(4); ListNode listNode11 = new ListNode(5); ListNode listNode12 = new ListNode(5); ListNode listNode13 = new ListNode(4); listNode2.next = listNode4; listNode4.next = listNode6; listNode6.next = listNode8; listNode8.next = listNode10; listNode10.next = listNode11; listNode11.next = listNode12; listNode12.next = listNode13; return listNode2; } }