1. 程式人生 > >Reverse LinkedList兩種解法

Reverse LinkedList兩種解法

Facebook店面第一輪就掛了,先問了簡歷, 然後問了reverse linked list的兩種解法以及分析,先用了recursive寫,然後說要space O(1),寫太慢了, 只寫了這道題和follow up

法一:指標,時間 O(n), 空間 O(1)
由於reverse需要兩個指標指向當前的reverse的兩個node,因此需要兩個指標,同時又需要一個指標指向後一個node來防止丟失後面的list,因此至少需要三個指標。
corner case:   1. list為空/list只有一個node:直接返回node;
		2.  list只有兩個node: 可以包含在主體程式碼裡,當第三個指標為null時結束返回。
example: 1 -> 2 -> 3 -> 4
	    1 ,  2,    3
code:
public ListNode reverseLinkedList(ListNode root) {
	if (root == null || root.next == null) return root;
	ListNode first = root;
	ListNode second = root.next;
ListNode third = root.next.next;
first.next = null;
while (third != null) {
	second.next = first;
	first = second;
	second = third;
	third = third.next;
}
second.next = first;
return second;
}
法二:遞迴,時間 O(n), 空間 O(n)
假設1~n-1已經全部完成,那麼1 -> 2 -> 3 -> 4   ------>  3-> 2 -> 1 -> null 和 4。因此,我們就把4加在3前面即可。
corner case:和上一樣
code:
public ListNode reverseLinkedList(ListNode root) {
	if (root == null || root.next == null) return root;
	ListNode cur = root;
	while (cur.next != null) {
	cur = cur.next;
}
helper(root, root.next);
return cur;
}
public void helper(ListNode first, ListNode second) {
	if (second == null) return first;
	helper(second, second.next);
	first.next = second.next;
	second.next = first;
}