判斷乙個鍊錶是否為回文結構

2021-10-04 18:25:41 字數 1253 閱讀 4399

【題目】 給定乙個鍊錶的頭節點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...