zoukankan      html  css  js  c++  java
  • 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?

    像1->2->1,1->2->2->1,1,NULL这种都是回文链表。我的思路是找到那个开始回文的点,然后以此为一个链表,再进行链表的翻转。两个链表就可以进行比较了

    如1->2->1,从第二个1处开始翻转,1->2->2->1,从第二个2处开始翻转。哎!每次代码都比较多,想不到简单一点的。不过这次的确达到了O(n)的时间复杂度

    和O(1)的空间复杂度

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
       ListNode * listReversal(ListNode *head)
        {
            if (!head || !head->next)return head;
            ListNode *mid=head->next,*last=mid->next;
            head->next = NULL;
            for (;last;)
            {
                mid->next = head;
                head = mid;
                mid = last;
                last = last->next;
            }
            mid->next = head;
            return mid;
    
        }
        bool isPalindrome(ListNode* head) {
    if (!head || !head->next)return true;
            ListNode *ptr = head;
            int cnt = 0;
            for (;ptr;ptr = ptr->next, ++cnt);
            cnt = (cnt % 2) ? (cnt / 2 + 2) : (cnt / 2 + 1);
            ptr = head;
            for (int i = 1;i < cnt;++i)
                ptr = ptr->next;
            ptr = listReversal(ptr);
            for (;ptr;ptr = ptr->next, head = head->next)
                if (ptr->val != head->val)return false;
            return true;
        }
    };
  • 相关阅读:
    JS内容左右滑动
    JS返回上一页
    两栏 三栏的css
    舅舅去世
    .net学习开始
    以论坛管理的方式来处理公司资讯
    《尽管去做》摘
    网页视频播放器代码集
    火影忍者和海贼王
    古代风水文献
  • 原文地址:https://www.cnblogs.com/csudanli/p/5331389.html
Copyright © 2011-2022 走看看