Leetcode

Leetcode.234.Palindrome Linked L

2019-12-04  本文已影响0人  Jimmy木

题目

给定一个单向链表,判断链表是否是回文(左右对称) 。

Input: 1->2->2->1
Output: true
Input: 1->2->2->3
Output: false

思路

最简单的是使用栈。
可以将链表的前版本部分倒序,然后和后半部分比较。

bool isPalindrome(ListNode* head) {
    if (head == nullptr) return true;

    ListNode *temp = head;
    int n = 1;
    while(temp->next != nullptr) {
        n++;
        temp = temp->next;
    }

    ListNode *before = nullptr;
    ListNode *root = head;
    ListNode *tmp = root->next;
    for (int i = 0; i < n /2; i++) {
        root->next = before;
        before = root;
        root = tmp;
        tmp = tmp->next;
    }
    ListNode *after = n%2 ? root->next : root;

    for (int i = 0;i < n / 2;i++) {
        if (before->val != after->val) {
            return false;
        } else {
            before = before->next;
            after = after->next;
        }
    }

    return true;
}

总结

链表的倒序方法比较奇妙,有点难理解。

    //链表倒序,时间复杂度O(1)
    ListNode *before = nullptr;
    ListNode *root = head;
    ListNode *tmp = root->next;
    for (int i = 0; i < n /2; i++) {
        root->next = before;
        before = root;
        root = tmp;
        tmp = tmp->next;
    }
上一篇下一篇

猜你喜欢

热点阅读