判斷鍊錶是否為回文結構(時間 空間複雜度有要求)

2021-07-22 12:06:59 字數 1488 閱讀 3972

題目:對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。

給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。

測試樣例:1->2->2->1

返回:true

考點:1. 判斷回文結構的方法

2. 要設計滿足時間、空間複雜度的演算法(難點)

知識點:1.使用快慢指標找到中間節點;

2.反轉鍊錶。

思路1:空間o(n)整個鍊錶遍歷兩邊, 開乙個棧,第一遍遍歷把鍊錶中每個元素push進棧中,這樣堆中的元素的pop順序就是鍊錶的倒序輸出;第二遍就開始pop棧中資料,每pop乙個資料,就把這個資料跟鍊錶中進行對比,如果相同繼續往下走,如果不同返回false。

此種情況下,時間複雜度為o(n),空間複雜度為o(n)。

/*

struct listnode

};*/

class palindromelist

while(a!=null && !s.empty())

else return false;

}return true;

// write code here

}};

思路2:空間o(1)

(1)使用快慢指標法,第一步設定乙個塊指標和乙個慢指標,快指標一次走兩步,慢指標一次走一步(慢),當快指標下一步為null的時候說明慢指標已經走了一半,這就可以找到中間節點。

(2)第二步反轉中間鍊錶後面的指標,

(3)第三部從頭尾向中間掃瞄,對比每個元素是否相等,如果都相等,則是回文數,否則不是回文數。(下面網友易水給出了**實現,這裡不再敘述)

/*

struct listnode

};*/

class palindromelist

if(mid==a) return true; //鍊錶元素個數為1時,未執行上述迴圈;

listnode* cur;

temp->next=null; //temp的作用完了,之後temp可以用於其他

cur=mid->next;

mid->next=null;

while(cur!=null)

while(a!=null && mid!=null)

else return false;

}return true;

// write code here

}};

注意此處:包含元素個數為2的情況,此時mid和fast都指向第二個元素

while(fast->next!=null)

不能簡單寫成這樣:此種情況忽略了元素個數為1和2的特殊情況。

while(fast->next->next!=null)

判斷鍊錶是否為回文結構

給定乙個鍊錶的頭節點 head,請判斷該鍊錶是否為回文 正反結構相同 結構。如果鍊錶長度為 n,時間複雜度達到 o n 額外空間複雜度達到 o 1 參考 程式設計師 面試指南 放入棧,時間複雜度o n 空間複雜度o n bool ispalindrome1 node head while null ...

OJ 判斷鍊錶是否為回文結構

思路 先找到鍊錶的中間節點,然後將鍊錶從中間節點之後的後半段反轉 然後將前半段與後半段逐一進行比較。鍊錶的建立 struct listnode bool ispalindrome struct listnode head 將後半段進行反轉 struct listnode newhead null s...

判斷是否為回文結構

法一 棧 時間o n 空間o n public static boolean ispanlindrome node head second second.next second指向後半部分第乙個元素 stackstack new stack while second null while stack...