請判斷乙個鍊錶是否為回文鍊錶。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
第一種演算法採用
def ispalindrome(self, head: listnode) -> bool:
vals =
current_node = head
while current_node is not none:
current_node = current_node.next
return vals == vals[::-1]
這是官方的給的題解
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
def ispalindrome(self, head: listnode) -> bool:
res =
while(head):
head = head.next
if len(res) <= 1:
return true
else:
n = len(res)
for i in range(n // 2):
if res[i] != res[n-1-i]:
return false
return true
官方給出的**比較簡潔。補充一下切片的知識
>>>a[:] #從左往右
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>a[::]#從左往右
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>a[::-1]#從右往左
>>> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
熟練操作切片,看起來是可以節省工作量 但是鍊錶題用陣列的方式去做,怎麼說也有點欠了一點感覺
第二種演算法:
用雙指標和反轉鍊錶的方法解決問題
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def ispalindrome(self, head):
""":type head: listnode
:rtype: bool
"""# 邊界條件不用忘記了
if not (head and head.next):
return true
p = listnode(-1)
p.next,low,fast = head,p,p
# 快慢指標不斷迭代,找到中間節點
while fast and fast.next:
low,fast = low.next, fast.next.next
cur,pre = low.next,none
low.next = none
#將鍊錶一分為二之後,反轉鍊錶後半部分
while cur:
cur.next,pre,cur = pre,cur,cur.next
a,b = p.next,pre
# 將鍊錶前半部分和 反轉的後半部分對比
while b:
if a.val!=b.val:
return false
a,b = a.next,b.next
return true
首先是實現這個**的邏輯:
是通過雙指標 快慢指標的方式 慢指標剛好停留在鍊錶的中間節點 然後將鍊錶分成兩部分 後半部分進行反轉 然後與前半部分進行對比
**中運用最多的是多元賦值,補充一點多元賦值的小知識
顧名思義:將多個變數同時進行賦值 採用這種賦值之後等號兩邊的物件都是元組。還有一點就是在python中等號的作用相當於指標,指向那個物件的記憶體。a = 10 a是乙個新建立的記憶體 10也有乙個記憶體 ,內在其實是a->10.
之所以採用多元賦值,其重要的原因還是節省**量,免去了中間在賦值乙個新的變數。
靜下心,細細品味,別有一番滋味。
演算法2 6回文鍊錶
題目描述 請編寫乙個函式,檢查鍊錶是否為回文。給定乙個鍊錶listnode phead,請返回乙個bool,代表鍊錶是否為回文。測試樣例 返回 true 返回 false 思路分析 因為使用的是鍊錶,只能查詢前面的元素,不能往後查詢。因此可以選用鍊錶 棧的方式儲存。1 首先,找到前面一半的元素,存到...
Leetcode 234 回文鍊錶 高階
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?遍歷一遍鍊錶壓棧,借助棧把鍊錶倒序,然後依次比較 原鍊錶元素 和 新棧中元素 如果都相等則返回true,否則返回false...
234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true首先建立兩個指標指向鍊錶,然後使其中乙個指標指向鍊錶中間,這裡可以使用另乙個指標快速移動,當另乙個指標移動速度是前一根指標的一倍時,就可以使slow指標到一半,而fast指標遍歷完了。使用...