234 - Palindrome Linked List

来源:互联网 发布:linux服务器禁止ping 编辑:程序博客网 时间:2024/05/22 02:00

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


0 0
原创粉丝点击