版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
};