Python演算法高階 4 回文鍊錶

2021-10-02 16:44:35 字數 2438 閱讀 1365

請判斷乙個鍊錶是否為回文鍊錶。

示例 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指標遍歷完了。使用...