因為回⽂串是對稱的, 所以正著讀和倒著讀應該是⼀樣的, 這⼀特點是解決回⽂串問題的關鍵.
這道題的關鍵在於, 單鏈表⽆法倒著遍歷, ⽆法使⽤雙指標技巧。 那麼最簡單的辦法就是, 把原始鍊錶反轉存⼊⼀條新的鍊錶, 然後⽐較這兩條鍊錶是否相同。
1、 先通過「雙指標技巧」 中的快慢指標來找到鍊錶的中點:
slow = fast = head
while fast and fast.
next
: slow = slow.
next
fast = fast.
next
.next
# slow
2、從slow開始反轉後面的鍊錶,現在就可以開始比較回文串了:
def
reverse
(head)
: pre =
none
curr = head
while curr:
nex = curr.
next
curr.
next
= pre
pre = curr
curr = nex
return pre
left = head
right = reverse(slow)
while right:
if left.val != right.val:
return
false
left = left.
next
right = right.
next
return
true
總結:
首先,尋找回文串是從中間向兩端擴充套件,判斷回文串是從兩端向中間收縮。對於單鏈表,無法直接倒序遍歷,可以造一條新的反轉鍊錶,可以利用鍊錶的後序遍歷,也可以用棧結構倒序處理單鏈表。
具體到回文鍊錶的判斷問題,由於回文的特殊性,可以不完全反轉鍊錶,而是僅僅反轉部分鍊錶,將空間複雜度降到 o(1)。
判斷單鏈表是否有環(快慢指標)
方法一 使用p q兩個指標,p總是向前走,但q每次都從頭開始走,對於每個節點,看p走的步數是否和q一樣。如圖,當p從6走到3時,用了6步,此時若q從head出發,則只需兩步就到3,因而步數不等,出現矛盾,存在環。方法二 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某個時候p q,則存...
判斷單鏈表是否為回文,快慢指標和棧
判斷單鏈表是否為回文,快慢指正加棧的方式解決 首先輸入這個鍊錶的長度,然後用尾插的方式,初始化鍊錶。接下來用快慢指標。快指標每次走兩步,慢指標每次走一步,當快指標的next為null時 也就是快指標走到了最後乙個 那麼慢指標剛好就在中間,因為鍊錶沒有環,所以將鍊錶的情況分為奇數和偶數兩種情況。當長度...
線性表 單鏈表 快慢指標
快慢指標 定義兩個指標,乙個快,乙個慢,可以有多種用途。例如 快速找到位置長度單鏈表中的中間結點 對於迴圈鍊錶中利用快慢指標也可以判斷是否存在環。快速找到位置長度單鏈表中的中間結點 1 使用乙個指標,先索引一遍獲取總長度,再取長度一半去迴圈獲取到中間值 o 3l 2 2 使用兩個指標,快指標和慢指標...