写题目 我们需要知道题目的原理
例:
1 2 3 2 1
1 4 5 7 5 4 1
1 2 2 1
像这种正着读和反着读相同
就是回文结构
那我们该怎么着解这道题目呢
我现在给大家看一个例题
那我们把中间数后的东西 倒过来
再让两个指针一个从开头 1 一个从3后面的第一个数 1 开始比较
如果第二个指针到最后一个节点 他们还是相等 就是回文
如果不相等 那他们就不是回文结构
这就是解题的思路
我们先创建两个函数
这两个函数功能分别是 找链表的中间节点 反转中间节点后的链表
找中间节点的函数命名为midhead(这里传的参数是题目给我们的A)
我们用快慢指针的思路去找
两个指针同时从头开始走
prve一次走一步,cur一次走两步
等cur走到最后一个节点时,prve走到的节点正好是中间节点
具体思路在 力扣题---链表的中间节点
struct ListNode* midhead(struct ListNode* head)
{
struct ListNode* prve=head;
struct ListNode* cur=head;
while(cur&&cur->next)
{
prve=prve->next;
cur=cur->next->next;
}
return prve;
}
反转中间节点后的链表(这里传参 参数是中间节点返回的参数)
我们创建两个指针
一个指针指向空(prve) 一个指针指向头(cur)
进循环再创建一个指针 这个指针保存cur的下一个节点
让他们一次反转
这里的反转思路比较长 需要的 点链接(这里也是另一个题目,这个函数用的就是那个题目的思路)力扣题---反转链表
想要解这题 务必去查看反转链表的思路
struct ListNode* midhead(struct ListNode* head)
{
struct ListNode* prve=head;
struct ListNode* cur=head;
while(cur&&cur->next)
{
prve=prve->next;
cur=cur->next->next;
}
return prve;
}
两个函数写完后
我们创建两个指针
一个指向头 一个指针中间节点
让他们同时判断是否相等
相等就返回true 不相等为false
接下来是源码
class PalindromeList {
public:
struct ListNode* midhead(struct ListNode* head)
{
struct ListNode* prve=head;
struct ListNode* cur=head;
while(cur&&cur->next)
{
prve=prve->next;
cur=cur->next->next;
}
return prve;
}
struct ListNode* revehead(struct ListNode* head)
{
struct ListNode* prve=NULL;
struct ListNode* cur=head;
while(cur)
{
struct ListNode* end=cur->next;
cur->next=prve;
prve=cur;
cur=end;
}
return prve;
}
bool chkPalindrome(ListNode* A) {
struct ListNode* mid=midhead(A);
struct ListNode* rev=revehead(mid);
while(A&&rev)
{
if(A->val!=rev->val)
{
return false;
}
else
{
A=A->next;
rev=rev->next;
}
}
return true;
}
};
如果本文对你有帮助 希望能获得你的赞和评论!