题意:判断链表是否为回文。
思路:用堆栈实现对链表的倒序读取。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
stack<ListNode*> mys;
ListNode* next = head;
while(next) {
mys.push(next);
next = next->next;
}
next = head;
ListNode* temp;
while(!mys.empty()) {
temp = mys.top();
mys.pop();
if(next->val != temp->val) return false;
next = next->next;
}
return true;
}
};
为了实现时间O(n),空间O(1),将后半段链表颠倒,再从两端向中间扫。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head == NULL) return true;
int n = 0;
ListNode* next = head;
while(next) {
n ++;
next = next->next;
}
if(n == 1) return true;
next = head;
n = ceil(n / 2.0);
while(n --) {
next = next->next;
}
//cout << next->val << endl;
//cout << endl;
ListNode* temp = next->next;
next->next = NULL;
while(temp) { //cout << temp->val << endl;
ListNode* tt = temp->next;
temp->next = next;
next = temp;
temp = tt;
}
temp = head;
while(next) { //cout << next->val << endl;
if(next->val != temp->val) return false;
temp = temp->next;
next = next->next;
}
return true;
}
};