要判断一个链表是否为回文链表,我们采用如下方法。
1、首先利用款慢指针找到中间节点
2、逆置中间节点后的链表,并返回一个新链表的头结点
3、将头结点与逆置链表的val值相比较,知道其中有一个为空,如果val值不一样,返回false
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* findmiddle(struct ListNode* head)
{
struct ListNode*fast = head,*slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
struct ListNode* reverse(struct ListNode*head)
{
struct ListNode* cur=head;
struct ListNode*Newhead = NULL;
while(cur)
{
struct ListNode*next = cur->next;
cur->next = Newhead;
Newhead=cur;
cur=next;
}
return Newhead;
}
bool isPalindrome(struct ListNode* head) {
struct ListNode*mid=findmiddle(head);
struct ListNode*rmid=reverse(mid);
while(head&&rmid)
{
if(head->val!=rmid->val)
return false;
head=head->next;
rmid=rmid->next;
}
return true;
}