快慢指標之判斷回 單鏈表

2021-10-07 09:19:49 字數 1071 閱讀 8367

因為回⽂串是對稱的, 所以正著讀和倒著讀應該是⼀樣的, 這⼀特點是解決回⽂串問題的關鍵.

這道題的關鍵在於, 單鏈表⽆法倒著遍歷, ⽆法使⽤雙指標技巧。 那麼最簡單的辦法就是, 把原始鍊錶反轉存⼊⼀條新的鍊錶, 然後⽐較這兩條鍊錶是否相同。

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 使用兩個指標,快指標和慢指標...