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

本文介绍了如何用C++判断链表是否为回文结构,通过快慢指针法实现。快指针每次前进两步,慢指针每次前进一步,当快指针到达链表尾部时,慢指针位于链表中间。接着将慢指针之后的部分逆序,然后比较逆序后的链表和原链表前半部分,不一致则返回错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
这是一道基础的链表知识,判断链表是否回文结构。在这里我使用了快慢指针法。
慢指针: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;
        }
};
用栈来判断链表是否为回文串是常见的算法问题,通常会先将链表转换成数组或者双向链表,然后利用栈的特性来实现。以下是使用栈的C++方法: 1. 遍历链表:首先,我们需要创建两个指针,一个正向遍历链表(`curr`),另一个反向遍历链表(`reverseCurr`)。初始时,反向指针设为链表的尾部。 2. 双向插入栈:当正向指针不为空时,将正向指针的节点值压入栈,同时移动正向和反向指针。这样可以保证栈顶元素始终包含链表中对应位置的节点。 3. 对比栈顶:当正向指针和反向指针相遇(或其中之一到达链表头)时,如果栈顶元素(正向节点)等于当前反向节点,继续比较下一个节点。如果所有节点都满足这个条件,链表就是回文的;否则不是。 4. 使用栈:C++中,可以使用`std::stack<int>`数据结构来保存节点值,`push()`用于入栈,`top()`获取栈顶元素,`pop()`移除栈顶元素。 ```cpp #include <iostream> #include <stack> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; bool isPalindrome(ListNode* head) { stack<int> s; ListNode* curr = head, *reverseCurr = new ListNode(0); reverseCurr->next = head; while (curr != nullptr && reverseCurr->next != nullptr) { s.push(curr->val); reverseCurr = reverseCurr->next; curr = curr->next; } while (reverseCurr->next != nullptr) { reverseCurr = reverseCurr->next; } while (!s.empty()) { if (s.top() != curr->val) { return false; } s.pop(); curr = curr->next; } return true; } int main() { // 测试代码省略 ListNode* list = ...; // 创建链表 if (isPalindrome(list)) { cout << "The linked list is a palindrome." << endl; } else { cout << "The linked list is not a palindrome." << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值