【題目】 給定乙個鍊錶的頭節點head,請判斷該鍊錶是否為回 文結構。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 高階: 如果鍊錶長度為n,時間複雜度達到o(n),額外空間複雜 度達到o(1)。
普通演算法:運用棧,將資料域的內容放入棧中,若即將加入的元素與棧頂元素相同,則不加入該元素,並出棧。最後如果棧為空,是回文結構。注:1->2->1 奇數個節點特殊處理中間的節點不入棧。額外空間複雜度為o(n/2)。
bool
is_palindrome
(node*head)
if(num ==1)
return
true
; temp = head;
mid = num /2;
while
(mid--)if
(num %2)
temp = temp-
>_next;
while
(!s.
empty()
)else
return
false;}
return
true
;}
高階演算法:找到中間的點,將鍊錶的後半部分翻轉,然後比較。注意最後將鍊錶翻轉回來不能破壞原來的結構。
找中點的方法:雙指標p1和p2,p1每次走一步,p2每次兩步,p2先走,p1後走,如果p2在走的過程中到達null,則,停止,返回p1的下乙個結點。
bool
is_palindrome2
(node*head)
if(num ==1)
return
true
; temp = head;
mid = num /2;
while
(mid--)if
(num %2)
temp = temp-
>_next;
reverse
(temp)
; node*help = temp;
while
(help)
else
return
false;}
reverse
(temp)
;return
true
;}
總結:整理思路上沒有什麼說的,找中點有些更方便的技巧,比如用快慢指標,這裡用的笨辦法,先找結點的總個數。 判斷乙個鍊錶是否為回文結構
題目 給定乙個鍊錶的頭結點head,判斷該鍊錶是否為回文結構。例如 1 2 1,返回true 1 2 2 1,返回true 15 6 15,返回true 1 2 3,返回false 方法一 利用棧結構實現。從頭遍歷鍊錶,遍歷的同時把加點一次壓入棧中。因為棧為先進後出結構,所以遍歷完成後,從棧頂到棧底...
判斷乙個鍊錶是否為回文結構
這道題的做法是首先找到列表中間的結點,然後把中間結點之後的鍊錶翻轉,然後同時遍歷兩個鍊錶,比較結點的資料是否相同,如果有不同的,返回false,遍歷完說明資料相同,返回true public class palindromelist fast fast.next slow slow.next ret...
判斷乙個鍊錶是否為回文結構
演算法專題導航頁面 題目描述 給定乙個鍊錶,請判斷該鍊錶是否為回文結構。輸入描述 n 表示鍊錶的長度。val 表示鍊錶節點的值 輸出描述 如果為回文結構輸出 true 否則輸出 false 示例1 輸入5 1 2 3 2 1 輸出true 備註 1 n 2000000 1000000 val 100...