画图画图画图:重要的事三遍! 牛逼的人略过
画图能让我们理解地更加地透彻! 第一种方法是找到中间节点然后可以分成两个头的链表,然后翻转后半部分链表 最后进行比较
画出来简单,其实实现的话就需要使用到我们前面讲过的链表的翻转和寻找链表的中间节点
1、寻找中间节点 我们这里使用双指针的方法 更清晰理解
2、链表的翻转 使用头插法
3、最后一步作对比
完整代码:
struct ListNode*middle(ListNode*head)
{
//寻找中间节点
struct ListNode*slow,*fast;
slow=fast=head;
while(fast&&fast->next)
{
slow=slow->next;//慢的一次走一步
fast=fast->next->next;//快的一次走两步
//就相当于fast走完了,slow才走到中间节点
}
return slow;
}
struct ListNode*reverselist(struct ListNode*head)
{
//使用头插法
struct ListNode*newhead=NULL;//新头
struct ListNode*cur=head;
while(cur)
{
//创建一个cur前面一个结点的指针,前驱
struct ListNode*next=cur->next;
//头插法
cur->next=newhead;//将newhead的地址放到cur->next里面
newhead=cur;//newhead就到了cur上面
cur=next;//cur前进一步
}
return newhead;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
//寻找中间节点
struct ListNode*mid=middle(A);
//链表逆序
struct ListNode*rhead=reverselist(mid);
//创建两个结点作比较
struct ListNode*n1=A;
struct ListNode*n2=rhead;
while(n1&&n2)//两个中走完
{
if(n1->val!=n2->val)
{
return false;
}
else
{
n1=n1->next;
n2=n2->next;
}
}
return true;
}
};
多多指教!