Leetcode 234 Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Follow up:
Could you do it in O(n) time and O(1) space?
题意
给出一个单链表,判断其是否是回文串,用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)
{
ListNode* rev=new ListNode(0);
ListNode* p=head;
while(p)
{
ListNode* tmp=new ListNode(0);
tmp->val=p->val;
tmp->next=rev->next;
rev->next=tmp;
p=p->next;
}
rev=rev->next;
ListNode* p1=head;
ListNode* p2=rev;
while(p1)
if(p1->val!=p2->val) return false;
else p1=p1->next,p2=p2->next;
return true;
}
};