判斷乙個鍊錶是否為回文鍊錶
使用空間為n:將鍊錶整個壓入棧。然後棧元素彈出。挨個比較元素是否相同。
使用空間為n/2:快慢指標。快指標一次兩步慢指標一次一步。快指標到達結尾時,慢指標到達中間,中間部分之後壓入棧。然後棧彈出元素,與前半部分相比較。
不使用額外空間:快慢指標。快指標一次兩步慢指標一次一步。快指標到達結尾時,慢指標到達中間。然後將後半部分鍊錶逆序。兩個指標分別從頭尾出發,進行元素比較。最後要將後半部分再還原回來。
//壓棧
public
static
boolean
ispalindrome1
(node head)
cur = head;
while
(cur!=null)
cur = cur.next;
}return
true;}
//快慢指標 n/2
public
static
boolean
ispalindrome2
(node head)
node cur = head;
//因為慢指標需要走到中間靠後的乙個位置
node right =head.next;
while
(cur.next!=null && cur.next.next!=null)
stack
stack =
newstack
<
>()
;while
(right!=null)
while
(!stack.
isempty()
) head = head.next;
}return
true;}
//快慢指標 後半部分反轉鍊錶 不占用額外空間
public
static
boolean
ispalindrome3
(node head)
node n1 = head;
//慢 node n2 = head;
//快while
(n2.next!=null &&n2.next.next!=null)
n2 = n1.next;
//先斷後連
/* 鍊錶逆序:
需要三個指標 後指標佔後、當前指標連線、前指標後移、當前指標後移
將第乙個節點的next設為空
改變所有後面指標的next
前指標後移;後指標後移
*/n1.next = null;
node n3 = null;
while
(n2 != null)
n3 = n1;
//儲存最後乙個節點
n2 = head;
boolean res =
true
;while
(n1!=null&&n2!=null)
n1 = n1.next;
n2 = n2.next;
} n1 = n3.next;
n3.next = null;
//頭部指標斷掉
/* 1.斷頭部指標
2. 改變所有後面指標的next
前指標後移;後指標後移
需要三個指標
(在斷掉後者重新連線的時候,一定需要乙個先佔住)
後指標佔後、 當前指標連線、前指標後移、當前指標後移
*/while
(n1!=null)
return res;
}// 後半部分反轉簡便寫法
public
boolean
ispalindrome4
(listnode head)
listnode l_end = slow;
listnode r_start = slow.next;
l_end.next = null;
listnode r_restart =
reverse
(r_start)
; listnode l_start = head;
// 使用乙個值儲存比較的值是否相等
boolean res =
true
; listnode l_cur = l_start;
listnode r_cur = r_restart;
while
(l_cur!=null && r_cur!=null)
l_cur = l_cur.next;
r_cur = r_cur.next;
}//將後面反轉並連線
r_start =
reverse
(r_restart)
; r_restart.next = null;
l_end.next = r_start;
return res;
}public listnode reverse
(listnode head)
return pre;
}}
234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true首先建立兩個指標指向鍊錶,然後使其中乙個指標指向鍊錶中間,這裡可以使用另乙個指標快速移動,當另乙個指標移動速度是前一根指標的一倍時,就可以使slow指標到一半,而fast指標遍歷完了。使用...
234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?正確思路是1.先找到鍊錶的中點 通過快慢雙指標,快指標一次移動兩個單位,慢指標一次移動乙個單位,當快指標頂到頭的時...
234回文鍊錶
題目描述 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 題解思路 首先反思一下,我這一題的第一想法是將整個鍊錶反轉,然後和原鍊錶同步遍歷,全部相同便是回文鍊錶,但是發現,你在反轉鍊錶的時候,原鍊錶被破壞了,所以第一次失敗。然後...