題目:對於乙個鍊錶,請設計乙個時間複雜度為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...