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;
}