思路:使用快慢指针找到链表中点,将后半部分链表翻转,然后从头和中点分别开始遍历比较节点值是否相同。

时间复杂度:O(n),其中n为链表长度,需要遍历整个链表。

空间复杂度:O(1),只需要常数个变量存储指针。

代码实现:

bool isPalindrome(ListNode* head) { if (head == nullptr || head->next == nullptr) { return true; }

ListNode* slow = head;
ListNode* fast = head;
while (fast->next != nullptr && fast->next->next != nullptr) {
    slow = slow->next;
    fast = fast->next->next;
}

ListNode* pre = nullptr;
ListNode* cur = slow->next;
while (cur != nullptr) {
    ListNode* next = cur->next;
    cur->next = pre;
    pre = cur;
    cur = next;
}
slow->next = pre;

ListNode* p1 = head;
ListNode* p2 = slow->next;
while (p2 != nullptr) {
    if (p1->val != p2->val) {
        return false;
    }
    p1 = p1->next;
    p2 = p2->next;
}
return true;

}

c++代码请编写算法判断链表是否为回文链表。如果是返回 true ;否则返回 false。要求:空间复杂度为O1并请分析程序的时间性能。

原文地址: https://www.cveoy.top/t/topic/bbK9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录