【題目】
給定乙個鍊錶的頭節點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 ...