题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
分析
题目让我们判断一个链表是否为回文链表,第一种方法我们将链表中的数据存在一个数组中,然后判断该数组是否为回文数组即可;另外一种方法将前半段链表反转与后半段链表比较若相同就是回文链表否则不是。
解决方案
方法一:转换法
将链表转为数组然后判断数组是否为回文数组
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int>cur;
int n;
while(head)
{
cur.push_back(head->val);
head=head->next;
}
n=cur.size();//存储数组长度
if(n==0)
return true;
if(n==1)
return true;
for(int i=n/2-1,j=(n+1)/2;i>=0,j<n;i--,j++)
{
if(cur[i]!=cur[j])
return false;
}
return true;
}
};
方法二:先求出链表长度,反转前段链表,然后与后段链表比较,相同返回true。关键之处是求出链表中间节点,链表长度为奇数时后半段链表头节点是head=head->next,为偶数时head不变(while循环)。
class Solution {
public:
bool isPalindrome(ListNode* head) {
int n=0,m;
ListNode*p=head;
while(p)//求链表长度
{
n++;
p=p->next;
}
if(0==n||1==n)
return true;
ListNode*cur=NULL;
ListNode*temp;
m=n/2;
while(m)
{
temp=head->next;
head->next=cur;
cur=head;
head=temp;
m--;
}//cur为反转链表的头节点
if(n%2!=0)//n为奇数时,head需要后移
head=head->next;
while(cur&&head)//比较两段链表,不同返回false
{
if(cur->val!=head->val)
return false;
cur=cur->next;
head=head->next;
}
return true;
}
};