演算法題009 -- [反轉單鏈表] by java
阿新 • • 發佈:2018-12-21
題目
反轉單鏈表,可以使用迭代或者遞迴的方法
思路
具象化反轉單鏈:
反轉前:
反轉中:
反轉後:
-
用文字來描述上圖的步驟:
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;
}
}