題目描述:對於一個鏈表,請設計一個時間複雜度爲O(n),額外空間複雜度爲O(1)的算法,判斷其是否爲迴文結構。給定一個鏈表的頭指針A,請返回一個bool值,代表其是否爲迴文結構。保證鏈表長度小於等於900。測試樣例:1->2->2->1返回:true
分析:使用一個棧來存儲鏈表數據,然後再比較棧數據和鏈表數據的值是否相等。用s.top()取棧頂元素,用s.pop()刪除棧頂元素。
(1)棧模板類的使用stack 模板類的定義在<stack>頭文件中stack 模板類需要兩個模板參數,一個是元素類型,一個容器類型,但只有元素類型是必要的,在不指定容器類型時,默認的容器類型爲deque。
定義stack的代碼如下
stack<int> s1;stack<string> s2;
stack的基本操作如下:
入棧,如例:s.push(x);
出棧,如例:s.pop(); 注意出棧只是刪除棧頂元素,並不返回棧頂元素
訪問棧頂,如例:s.top(); 返回棧頂元素
判斷棧空,如例:s.empty(),當棧空時,返回true。
訪問棧中的元素個數,如例:s.size()
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
stack<int> B;
ListNode* p=A;
while(A!=NULL)
{
B.push(A->val);
A=A->next;
}
while(p!=NULL)
{
if(p->val !=B.top())
return false;
else
{
B.pop();
p=p->next;
}
}
return true;
}
};