鍊錶問題 判斷乙個鍊錶是否為回文結構

2021-08-10 17:29:58 字數 2087 閱讀 5545

【題目】

給定乙個鍊錶的頭節點head,請判斷該鍊錶是否為回文結構。

高階:如果鍊錶長度為n,要求時間複雜度o(n),空間複雜度o(1)。

【基本思路】

方法一。時間複雜度o(n),空間複雜度o(n)。

使用棧,遍歷一遍鍊錶把每個節點都壓入棧中,這樣在彈出棧的時候,所有的節點就逆序了。依次對比原鍊錶的每個節點即可。

#python3.5

def ispalindrome1(head):

if head == none or head.next == none:

return true

stack =

cur = head

while cur != none:

cur = cur.next

while stack:

if stack.pop().val != head.val:

return false

head = head.next

return true

方法二。時間複雜度o(n),空間複雜度o(n/2)。

也使用棧,但是這次只將鍊錶的後半部分壓入棧中,這樣在彈出棧的時候,後半部分的節點就逆序了。依次對比鍊錶的前半部分和逆序後的後半部分的每個節點即可。

def ispalindrome2(head):

if head == none or head.next == none:

return true

stack =

pre = head.next

cur = head

while cur.next != none and cur.next.next != none:

pre = pre.next

cur = cur.next.next

while pre != none:

pre = pre.next

while stack:

if stack.pop().val != head.val:

return false

head = head.next

return true

方法三。時間複雜度o(n),空間複雜度o(1)。

首先改變鍊錶右半區的結構,使整個右半區的指標反指,中間節點的next指向none。接下來從兩端開始向中間依次對比即可。需要注意的是,再判斷完畢後要將鍊錶調整會原鍊錶的結構。

def ispalindrome3(head):

if head == none or head.next == none:

return true

pre = head

cur = head

while cur.next != none and cur.next.next != none:

pre = pre.next

cur = cur.next.next

node = pre.next

pre.next = none

while node != none:

next = node.next

node.next = pre

pre = node

node = next

node = pre

res = true

while pre != none and head != none:

if pre.val != head.val:

res = false

break

pre = pre.next

head = head.next

pre = node.next

node.next = none

while pre != none:

next = pre.next

pre.next = node

node = pre

pre = next

return res

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

思路1 找到中間節點然後把後面的翻轉,需要斷開鍊錶 然後比較和頭節點開始的前段,最後要是後半段的游標可以走到最後說明是回文否則不是 思路2 整體翻轉比較 思路3 借助乙個棧存放前半段的元素,然後和後半段的比較 public boolean ispalindrome listnode head lis...

鍊錶 判斷乙個鍊錶是否為回文結構

題目 給定鍊錶的頭節點,判斷該鍊錶是否為會問結構 如果鍊錶的長度為n,時間複雜度達到o n 額外空間複雜度達到o 1 方法一 public class node public boolean ispalindromel node head while head null head head.next...

鍊錶 判斷乙個鍊錶是否為回文結構

方法1 利用棧 t o n s o n 將鍊錶壓入棧,利用棧的先進後出逆序出鍊錶對比原鍊錶各節點值 public static boolean ispalindome1 node head cur head while s.isempty return true 方法2 利用棧 t o n s o ...