标签:
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(n)的计算时间复杂度,需要O(1)的存储空间,所以可以将后半部分链表逆序,再一个个比较
#include<iostream>
#include<vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reversed(ListNode* L1,ListNode* L2)
{
if(L1==L2)
{
L1->next==NULL;
return L1;
}
if(L1->next==L2)
{
L2->next=L1;
L1->next=NULL;
return L2;
}
ListNode* ptr1=L1;
ListNode* ptr2=ptr1->next;
ListNode* ptr3=ptr2->next;
while(ptr3!=L2)
{
ptr2->next=ptr1;
ptr1=ptr2;
ptr2=ptr3;
ptr3=ptr3->next;
}
ptr2->next=ptr1;
ptr1->next=NULL;
return ptr2;
}
bool isPalindrome(ListNode* head) {
if(head==NULL)
return 0;
if(head->next==NULL)
return 1;
ListNode* ptr1=head;
int n=1;
while(1)
{
if(ptr1->next==NULL)
break;
n++;
ptr1=ptr1->next;
}
int mid=n/2;
ListNode* ptr2=head;
int jishu=1;
while(1)
{
if(jishu==mid)
break;
jishu++;
ptr2=ptr2->next;
}
ListNode* ptr3=ptr2->next;
ptr1=reversed(ptr3,ptr1);
ListNode* ptr0=head;
if(n/2==0)
{
while(ptr1!=NULL)
{
if(ptr1->next!=ptr0->next)
return 0;
ptr1=ptr1->next;
ptr0=ptr0->next;
}
return 1;
}
else
{
while(ptr1!=ptr3)
{
if(ptr1->next!=ptr0->next)
return 0;
ptr1=ptr1->next;
ptr0=ptr0->next;
}
return 1;
}
}
int main()
{
int vec[20]={-31900,22571,-31634,19735,13748,16612,-28299,-16628,9614,-14444,
-14444,9614,-16628,-31900,16612,13748,19735,-31634,22571,-28299};
ListNode* root=new ListNode(-31900);
ListNode* ptr1=root;
int i=1;
while(i<20)
{
ptr1->next=new ListNode(vec[i]);
ptr1=ptr1->next;
i++;
}
cout<<isPalindrome(root)<<endl;
}
leetcode_234题——Palindrome Linked List(链表)
标签:
原文地址:http://www.cnblogs.com/yanliang12138/p/4655453.html