對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。
給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。
測試樣例:
1->2->2->1返回:true
思路:由於空間複雜度要求為o(1),也就是說臨時占用空間和輸入資料規模無關,因此無法利用陣列或者是棧進行判斷。因此先找到中間位置將後半部分指標翻轉,然後兩端分別比較。注意這種方法會修改原鍊錶,但是空間複雜度要求為o(1)也只能這麼做了。
程式執行流程:
1、利用快慢指標找到中間的位置(起初均指向頭結點,然後pslow一次走一步,pfast一次走兩步。注意不需要區分鍊錶結點個數是奇數還是偶數);
2、將後半部分指標翻轉;3、最後再進行一次遍歷,乙個從前向後,乙個從後向前。
下圖是演示圖(分為鍊錶結點個數奇數和偶數兩種情況),當pfast或pfast->next到達尾部(為null)時,pslow正好到達中間位置。其中當鍊表結點個數為偶數時,pfast首先變為null;
當鍊表結點個數為奇數時,pfast->next首先變為null。
本程式說明:34
時間限制:3秒 空間限制:32768k 熱度指數:8332
5本題知識點: 鍊錶 棧67
題目描述
8對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。
9給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。
10測試樣例:
111->2->2->1
12返回:true
1314
*/15
16 #include 17
using
namespace
std;
1819
struct
listnode
23};
2425
//鍊錶結點構造
26 listnode* create_list_node(int
val)
2731
//鍊錶結點連線
32void connect_list_node(listnode* pcur, listnode*pnext)
3336
3738
39class
palindromelist
51//
反轉鍊錶後半部分指標
52 listnode* prev = pslow;//
臨時儲存用
53 pslow = pslow->next;
54 prev->next = null;//
最中間的點的next置為null
55while(pslow !=null)
5663
64 listnode* pforward = a;//
指向頭結點
65 listnode* pbackward= prev;//
指向鍊錶最後乙個結點
6667
while(!(pforward == pbackward || pforward->next ==pbackward))
6874
return
true;75
}76};77
78void
test()
79107
108int
main()
109
歡迎交流。
鍊錶回文判斷
判斷一條單向鍊錶是不是 回文 回文,英文palindrome,指順著讀和反過來讀都一樣。判斷回文單向鍊錶跟判斷回文字串很大的區別就是遍歷。字串可以自由向前遍歷,而單向字串不行,因此最簡單直觀的思路就是將鍊錶翻轉,然後再進行比較。但是這種方法就比較笨,因為還需要建立另外乙個單鏈表來儲存原有的單鏈表,然...
判斷回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。鍊錶為單向無環鏈表 示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 這題是讓判斷鍊錶是否是回文鍊錶,所謂的回文鍊錶就是以鍊錶中間為中心點兩邊對稱。我們常見的有判斷乙個字串是否是回文字串,這個比較簡單,可以使用兩個指標,乙個最左邊...
鍊錶 (判斷回文鍊錶)演算法
coding utf 8 author leadingme mail leadingme qq.com mywebsite leadingme.top 回文鍊錶 演算法要求 判斷乙個鍊錶是否為回文鍊錶 示例1 輸入 1 2 輸出 false 示例2 輸入 1 2 2 1 輸出 true class ...