C++判断链表是否为回文链表
作者:野牛程序员:2023-07-05 08:00:12 C++阅读 2600
要判断一个链表是否为回文链表,可以使用双指针和栈的方法。以下是使用C++实现的一个示例:
#include <iostream> #include <stack> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; bool isPalindrome(ListNode* head) { if (head == nullptr || head->next == nullptr) { // 链表为空或只有一个节点,视为回文链表 return true; } ListNode* slow = head; // 慢指针 ListNode* fast = head; // 快指针 stack<int> st; // 用于存储前半部分节点的值 // 将慢指针移到链表的中间位置,并将前半部分节点的值存入栈中 while (fast != nullptr && fast->next != nullptr) { st.push(slow->val); slow = slow->next; fast = fast->next->next; } // 链表长度为奇数,跳过中间节点 if (fast != nullptr) { slow = slow->next; } // 逐个比较后半部分节点的值与栈中的值 while (slow != nullptr) { if (slow->val != st.top()) { return false; } st.pop(); slow = slow->next; } return true; } int main() { // 创建一个示例链表: 1 -> 2 -> 3 -> 2 -> 1 ListNode* head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(2); head->next->next->next->next = new ListNode(1); bool palindrome = isPalindrome(head); if (palindrome) { cout << "链表是回文链表" << endl; } else { cout << "链表不是回文链表" << endl; } // 释放链表内存 ListNode* curr = head; while (curr != nullptr) { ListNode* temp = curr; curr = curr->next; delete temp; } return 0; }
在上述代码中,我们使用了两个指针,一个慢指针和一个快指针。快指针每次移动两个节点,慢指针每次移动一个节点。同时,我们使用一个栈来存储前半部分节点的值。当快指针到达链表末尾时,慢指针指向链表中间位置。然后,我们将慢指针后面的节点值与栈中的值逐个进行比较,如果不相等,则链表不是回文链表。
注意,在实际应用中,我们还需要考虑链表为空或只有一个节点的情况。这种情况下,我们可以视链表为回文链表。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:Python判断链表是否为回文链表
- 下一篇:C/C++静态变量在堆还是在栈