问题描述:
Given a singly linked list, determine if it is a palindrome.
问题分析:
要判断一链表是否是回文的,首先应该确定好它的中点指针。因此我们可以用双指针寻找,一个移动的快fast,一个移动的慢slow。
找到中点后,经中点以后的链表翻转,然后从头指针依次对比。
给个例子对比下面的代码可能会更好理解一下:
给定链表1->2->1,显然是个回文的。
经过寻找中点和链表翻转后,以上链表变为1->2->1,slow指针指向最后一个结点,head指向第一个结点,经过比较即可得出答案。
过程详见代码:
/**
* 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||head->next==NULL)
return true;
ListNode* slow=head;
ListNode* fast=head;
while(fast->next!=NULL&&fast->next->next!=NULL){
slow=slow->next;
fast=fast->next->next;
}
slow->next=reverseList(slow->next);
slow=slow->next;
while(slow!=NULL){
if(head->val!=slow->val)
return false;
head=head->next;
slow=slow->next;
}
return true;
}
ListNode* reverseList(ListNode* head) {
ListNode* pre=NULL;
ListNode* next=NULL;
while(head!=NULL){
next=head->next;
head->next=pre;
pre=head;
head=next;
}
return pre;
}
};