判断链表是否回文结构(c++)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960402/article/details/87873556

在这里插入图片描述
这是一道基础的链表知识,判断链表是否回文结构。在这里我使用了快慢指针法。
慢指针:P1每次走一步 P1->next
快指针:P1每次走两步 P1->next->next
主要想法:当P2走到末尾时,P1只走了整个行程的一半,只要将剩下部分逆序就可以进行判断了

在这里插入图片描述
当P2为空时,P1刚好走到了中间的位置,程序如下
ListNode* P1=A;
ListNode* P2=A; //赋值给P1和P2
while(P2&&P2->next){ //遍历直到P2为空
P1=P1->next;
P2=P2->next->next;}
在这里插入图片描述
将没有遍历完的P1逆序
ListNode* temp;
ListNode* NEWhead=NULL; //定义两个空节点
while (P1!=NULL){ //程序逆序
temp=P1->next;
P1->next=NEWhead;
NEWhead=P1;
P1=temp; }

在这里插入图片描述
将逆序后的NEWhead和A做对比,不同则返回错误,遍历直到NEWhead结束
while (NEWhead!=NULL){
if (A->val!=NEWhead->val){
return false;
}
NEWhead=NEWhead->next;
A=A->next;
}
总的代码

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        ListNode*  P1=A;
        ListNode* P2=A;
        while(P2&&P2->next){
            P1=P1->next;
            P2=P2->next->next;
        }
        ListNode* temp;
        ListNode* NEWhead=NULL;
        while (P1!=NULL){
            temp=P1->next;
            P1->next=NEWhead;
            NEWhead=P1;
            P1=temp;
        }
        while (NEWhead!=NULL){
            if (A->val!=NEWhead->val){
                return false;
            }
           NEWhead=NEWhead->next;
           A=A->next;
            }
         return true;
        }
};

猜你喜欢

转载自blog.csdn.net/qq_37960402/article/details/87873556