請判斷乙個鍊錶是否為回文鍊錶。
示例 1:輸入: 1->2
輸出: false
示例 2:listnode的定義**:高階:輸入: 1->2->2->1
輸出: true
你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?
# definition for singly-linked list.
class listnode:
def __init__(self, x):
self.val = x
self.next = none
**1:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""@author: wowlnan
@github:
@blog:
"""class solution:
def ispalindrome(self, head: listnode) -> bool:
a=temp=head
while temp!=none:
temp=temp.next
l=len(a)
if l==1:
return true
mid=int(l/2)
for i in range(mid):
if a[i]!=a[l-1-i]:
return false
return true
**2:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""@author: wowlnan
@github:
@blog:
"""class solution:
def ispalindrome(self, head: listnode) -> bool:
if head==none:
return true
temp=head
i=0while temp!=none:
i+=1
temp=temp.next
l=imid=int(l/2)
temp=head
i=0flag=l%2==0
left=''
right=''
while temp!=none:
if i這裡o(1)空間複雜度是?
如果是指單個鍊錶指標的空間的常數,兩段**似乎都不符合要求。
那麼試試**3:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""@author: wowlnan
@github:
@blog:
"""class solution:
def ispalindrome(self, head: listnode) -> bool:
if head==none:
return true
left=head
i=0while left!=none:
i+=1
left=left.next
l=imid=int(l/2)
i=0left=head
right=head
while right!=none:
if i==mid:
break
right=right.next
i+=1
pre=none
cur=right
nex=none
righthead=none
while cur!=none:
nex=cur.next
if nex==none:
righthead=cur
cur.next=pre
pre=cur
cur=nex
right=righthead
i=0while left!=none and right!=none and i原理簡單就不說了。時間複雜度實際應該是3遍遍歷鍊錶,即o(n),空間也滿足o(1)。
注:最後乙個迴圈i的存在只是為了比較清晰說明迴圈的終止位置或者說是迴圈次數,即 n / 2。
鍊錶 單向鍊錶
討論單鏈表之前,我們先來討論下面這個問題。順序表存在的一些問題 中間 頭部的插入刪除,時間複雜度為o n 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗。增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以後增容到200,我們再繼續插入了5個資料,後面沒有資料插入了...
鍊錶(單向鍊錶,雙向鍊錶)
首先鍊錶是以節點的方式儲存資料的,每個節點包含資料域 data 節點域 next 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...
字元鍊錶(單向)C語言
建立乙個鍊錶,該鍊錶可以存放從鍵盤輸入的任意長度的字串,以按下回車鍵作為輸入的結束。統計輸入的字元個數並將其字串輸出。include include struct symbol struct symbol createsym struct symbol p void listsym struct s...