题目描述:

方法一:
找到链表的中间结点。
图片解疑:

从中间结点开始把后面的链表反转。注:详细请看附录链接
图片解疑:

判断头结点的值和尾结点的值是否一样。
代码实例:
cpp
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>
#include<stdio.h>
ListNode* middlenode(ListNode* head)
{
ListNode* fast,*slow;//快慢指针
fast=slow=head;
while(fast && fast->next)
{
slow=slow->next;//slow走一步
fast=fast->next->next;//fast走两步
}
return slow;//返回中间结点
}
ListNode* reverseList(ListNode* head)
{
ListNode* n1,*n2,*n3;
n1=NULL,n2=head,n3=head->next;
while(n2)
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)
{
n3=n3->next;
}
}
return n1;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
//找中间结点
ListNode* mid=middlenode(A);
//反转链表
ListNode* right=reverseList(mid);//返回的是尾结点
//遍历和判断
ListNode* left=A;
while(right)
{
if(left->val != right->val)
{
return false;
}
left=left->next;
right=right->next;
}
return true;
}
};
方法二:
创建数组把链表的val值存储进去。
在数组中判断是否为回文结构。
代码实例:
cpp
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
int arr[900]={0};
ListNode* newnode=A;
int i=0;
while(newnode)
{
arr[i++]=newnode->val;
newnode=newnode->next;
}
int left=0;
int right=i-1;
while(left<right)
{
if(arr[left] != arr[right])
{
return false;
}
left++;
right--;
}
return true;
}
};
完!!