zoukankan      html  css  js  c++  java
  • [LeetCode] 234. Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome.

    Follow up:
    Could you do it in O(n) time and O(1) space?

    给一个链表,判断是否为回文。

    如果是字符串就比较容易判断。但链表不能通过index来直接访问,而只能从头开始遍历到某个位置。

    解法1: 用fast和slow两个指针,每次快指针走两步,慢指针走一步,等快指针走完时,慢指针的位置就是中点。还需要用栈,每次慢指针走一步,都把值存入栈中,等到达中点时,链表的前半段都存入栈中了,由于栈的后进先出的性质,就可以和后半段链表按照回文对应的顺序比较。

    解法2: O(1) sapce,不能使用stack了,而是将链表中的一半翻转一下,这样前后两段链表就可以按照回文的顺序比较。

    Python:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    #
    
    class Solution:
        # @param {ListNode} head
        # @return {boolean}
        def isPalindrome(self, head):
            reverse, fast = None, head
            # Reverse the first half part of the list.
            while fast and fast.next:
                fast = fast.next.next
                head.next, reverse, head = reverse, head, head.next
    
            # If the number of the nodes is odd,
            # set the head of the tail list to the next of the median node.
            tail = head.next if fast else head
    
            # Compare the reversed first half list with the second half list.
            # And restore the reversed first half list.
            is_palindrome = True
            while reverse:
                is_palindrome = is_palindrome and reverse.val == tail.val
                reverse.next, head, reverse = head, reverse, reverse.next
                tail = tail.next
    
            return is_palindrome  

    C++: 解法1

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            if (!head || !head->next) return true;
            ListNode *slow = head, *fast = head;
            stack<int> s;
            s.push(head->val);
            while (fast->next && fast->next->next) {
                slow = slow->next;
                fast = fast->next->next;
                s.push(slow->val);
            }
            if (!fast->next) s.pop();
            while (slow->next) {
                slow = slow->next;
                int tmp = s.top(); s.pop();
                if (tmp != slow->val) return false;
            }
            return true;
        }
    };
    

    C++: 解法2

    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            if (!head || !head->next) return true;
            ListNode *slow = head, *fast = head;
            while (fast->next && fast->next->next) {
                slow = slow->next;
                fast = fast->next->next;
            }
            ListNode *last = slow->next, *pre = head;
            while (last->next) {
                ListNode *tmp = last->next;
                last->next = tmp->next;
                tmp->next = slow->next;
                slow->next = tmp;
            }
            while (slow->next) {
                slow = slow->next;
                if (pre->val != slow->val) return false;
                pre = pre->next;
            }
            return true;
        }
    };
    

      

    类似题目:

    [LeetCode] 206. Reverse Linked List 反向链表

    [LeetCode] 92. Reverse Linked List II 反向链表II

    [LeetCode] 125. Valid Palindrome 验证回文字符串

    [LeetCode] 9. Palindrome Number 验证回文数字

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    有关人工智能的假设
    遥感数据下载
    envi几何校正
    2440裸 Delay(); 和 while(!(rUTRSTAT0 &amp; 0x2)); 问题
    hadoop排序组合键的使用情况
    ASP.NET——RequiredFieldValidator控制和ValidationSummary控制
    TFTP server组态
    Notification(一个)——使用演示样本的基础知识
    学习计划,我希望这不会虎头蛇尾
    只有有lua编译能力不足200K代码吧?NO! Python 有可能。
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8628183.html
Copyright © 2011-2022 走看看