链栈判断回文,C++
时间: 2024-11-01 16:07:48 浏览: 23
链栈判断回文的一种常见方法是使用两个指针,一个从链表头部开始(即正序遍历),另一个从尾部开始(反序遍历)。同时移动这两个指针,并比较它们指向的节点值是否相等,直到两个指针相遇或者一个指针到达链表尾部。
以下是基本的步骤:
1. 创建两个指针,`p1` 初始化为头节点,`p2` 初始化为尾节点(如果链表长度大于1)。
2. 比较 `p1` 和 `p2` 指向的节点,如果相等,则继续移动指针;如果不等,链表不是回文,返回 false。
3. 当 `p1` 到达链表中部时(若链表长度为奇数,`p2` 已经到达尾部;若偶数,`p1` 和 `p2` 相遇),检查剩下的部分是否也为回文。这可以通过将其中一个指针(通常是 `p1`)向后移动一位,然后继续上述步骤完成。
4. 如果整个过程都未发现不相等的节点,则链表是回文,返回 true。
```cpp
class ListNode {
public:
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
bool isPalindrome(ListNode* head) {
if (!head || !head->next) {
return true; // 单个节点或空链表都是回文
}
ListNode* p1 = head;
ListNode* p2 = head->prev; // 让 p2 从倒数第二个元素开始
while (p2 && p1 != p2) {
if (p1->val != p2->val) {
return false; // 发现不相等,非回文
}
p1 = p1->next;
p2 = p2->prev;
}
return true; // 所有节点都匹配,所以是回文
}
```
阅读全文