时间性能分析:

  • 遍历一遍链表,判断链表长度,时间复杂度为O(n)
  • 将链表后半部分翻转,时间复杂度为O(n/2)
  • 依次比较前半部分和后半部分的节点值是否相等,时间复杂度为O(n/2) 总时间复杂度为 O(n)

代码如下:

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

    // 1. 计算链表长度
    int len = 0;
    ListNode* p = head;
    while (p != nullptr) {
        len++;
        p = p->next;
    }

    // 2. 翻转后半部分链表
    ListNode* prev = nullptr;
    p = head;
    for (int i = 0; i < len / 2; i++) {
        prev = p;
        p = p->next;
    }
    ListNode* tail = prev;
    while (p != nullptr) {
        ListNode* next = p->next;
        p->next = prev;
        prev = p;
        p = next;
    }
    tail->next = nullptr;

    // 3. 比较前半部分和后半部分的节点值
    ListNode* p1 = head;
    ListNode* p2 = prev;
    bool result = true;
    while (p1 != nullptr && p2 != nullptr) {
        if (p1->val != p2->val) {
            result = false;
            break;
        }
        p1 = p1->next;
        p2 = p2->next;
    }

    // 4. 恢复后半部分链表
    prev = nullptr;
    p = tail;
    while (p != nullptr) {
        ListNode* next = p->next;
        p->next = prev;
        prev = p;
        p = next;
    }
    tail->next = prev;

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

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

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