主要思想,先找到中間結點,對後半段鍊錶反轉,然後一一對比資料,看看是不是相同,相同就是回文鍊錶,不同就不是
import sys
# 引用當前資料夾下的single_linked_list
from singly_linked_list import singlylinkedlist
def reverse(head):
#引入新結點反轉兩個鍊錶之間的結構
reverse_head = none
while head:
temp_next = head.next
head.next = reverse_head
reverse_head = head
head = temp.next
return revese_head
def is_palindrome(l):
# 利用快慢指標先找到中間結點
l.print_all()
slow = l._head
fast = l._head
position = 0
while fast and fast.next:
slow = slow.next
fast = fast.next.next
position += 1
#反轉剩餘一半結點,然後對比每個資料結點的資料
reverse_node = reverse(slow)
head_node = l._head
is_palin = true
while (head_node and reverse_node):
if (head_node.data == reverse_node.data):
head_node = head_node.next
reverse_node = reverse_node.next
else:
is_palin = false
break
return is_palin
if __name__ == '__main__':
# the result should be false, true, true, true, true
test_str_arr = ['ab', 'aa', 'aba', 'abba', 'abcba']
for str in test_str_arr:
l = singlylinkedlist()
for i in str:
l.insert_value_to_head(i)
print(is_palindrome(l))
leetcode 234 判斷是不是回文鍊錶
聰明的我想到了利用棧先進後出的特性,求出鍊錶的長度之後前一半入棧,後一半出棧的方法,雖然簡單易懂,但是效率有點低,貼 definition for singly linked list.struct listnode listnode int x val x next nullptr listnod...
判斷一條單向鍊錶是不是 回文
題目 判斷一條單向鍊錶是不是 回文 思路一 採用快慢指標,慢指標入棧,當快指標為null時,出棧和慢指標比較即可。時間複雜度o n 空間複雜度o n 優點 比較好實現,且沒有修改鍊錶 缺點 需要分配記憶體 include include include typedef int elem typede...
判斷是不是回文鍊錶的方法 3種
struct treelist treelist int a 使用棧來做,這是最簡單的方法,空間複雜度為o n bool isre 1 treelist p while p return true 使用快慢指標尋找中點,能夠比普通的暴力解法省一半的空間 bool isre 2 treelist p ...