• Leetcode 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?

    题目意思:

      给定一个单链表,判断它是不是回文串

      进一步思考:

        你可以在O(n)时间复杂度和O(1)空间复杂度完成吗?

    解题思路:

    方法一:通过反转链表实现

      (1)使用快慢指针寻找链表中点

      (2)将链表的后半部分就地逆置

      (3)比较前后两半的元素是否一致

      (4)恢复原始链表的结构

    方法二:通过递归实现

      (1)递归遍历链表到最后一个元素

      (2)如果第一个元素和最后一个元素相等,则递归回退,且第一个元素left=left->next

      (3)如果所有元素相等,则认为是回文串

    源代码:

    方法一:

     1 class Solution {
     2 public:
     3     bool isPalindrome(ListNode* head) {
     4         if(head == NULL || head->next == NULL ) return true;
     5         ListNode* fast = head, *slow = head;
     6         while(fast->next && fast->next->next){
     7             fast = fast->next->next;
     8             slow = slow->next;
     9         }
    10         ListNode *p = slow->next, *second = NULL;
    11         while(p){
    12             ListNode* tmp = p->next;
    13             p->next = second;
    14             second = p;
    15             p = tmp;
    16         }
    17         ListNode* p1 = head, *p2 = second;
    18         while(p2 && p1->val == p2->val){
    19             p1 = p1->next;
    20             p2 = p2->next;
    21         }
    22         p = second; second = NULL;
    23         while(p  ){
    24             ListNode *tmp = p->next;
    25             p->next = second;
    26             second = p;
    27             p = tmp;
    28         }
    29         return p2 == NULL ;
    30     }
    31 };

    方法二:

     1 class Solution {
     2 public:
     3     bool isPalindrome_aux(ListNode** left, ListNode* right){
     4             if(right == NULL) return true;
     5             if(!isPalindrome_aux(left,right->next)) return false;
     6             bool res = (right->val == (*left)->val);
     7             *left = (*left)->next;
     8             return res;
     9         
    10     }
    11     bool isPalindrome(ListNode* head) {
    12         return isPalindrome_aux(&head,head);
    13     }
    14 };

      

  • 相关阅读:
    (译+原)std::shared_ptr及std::unique_ptr使用数组
    (转+原)ipp "No dlls were found in the Waterfall procedure"
    (原)vs2013编译boost1.60库
    (原+转)VS2013:正在从以下位置加载符号
    (原)直方图的相似性度量
    (原)Opencv中直方图均衡和图像动态范围拉伸的代码
    JAVA 8 新特性 Stream API 创建
    JAVA 8 新特性 Stream API 介绍
    JAVA 8 新特性 方法引用
    JAVA 8 新特性 函数式接口
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/4696264.html
Copyright © 2020-2023  润新知