Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
沒有達到上述的 O(1) space。
思路:
將 鏈表的前半部分壓入棧中,然後逐個彈出和鏈表的後半部分比較,從而獲知是否迴文。
寫的過程中,主要遇到的問題集中在鏈表長度爲奇偶數的不同,奇數要先彈出棧頂元素。
C++ 代碼如下:
#include <iostream>
#include <stack>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == NULL || head->next == NULL)
return true;
ListNode * current = head;
int i, length;
for( i = 0; current != NULL; i++ ) {
current = current->next;
}
length = i;
stack<int> mystack;
current = head;
int limit = length /2 ;
if(length % 2 != 0)
limit ++;
for(int i = 0; i < limit; i++, current = current->next)
mystack.push(current->val);
if(length % 2 != 0)
mystack.pop();
for( --i; i < length && current != NULL; current = current->next) {
int v;
if(!mystack.empty()) {
v = mystack.top();
mystack.pop();
}
if(v != current->val)
return false;
}
return true;
}
ListNode * init() {
ListNode * head = new ListNode(1);
ListNode * second = new ListNode(2);
ListNode * third = new ListNode(2);
ListNode * forth = new ListNode(1);
ListNode * fifth = new ListNode(3);
head->next = second;
head->next->next = third;
head->next->next->next = forth;
head->next->next->next->next = fifth;
if( isPalindrome(head) == true )
cout << "yes" << endl;
else cout << "no" << endl;
while( head != NULL) {
cout << head->val << endl;
head = head->next;
}
return head;
}
};
int main() {
Solution s;
s.init();
return 0;
}