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

    请检查一个链表是否为回文链表。

    进阶:
    你能在 O(n) 的时间和 O(1) 的额外空间中做到吗?

    详见:https://leetcode.com/problems/palindrome-linked-list/description/

    Java实现:

    方法一:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isPalindrome(ListNode head) {
            //0个节点或是1个节点
            if(head==null||head!=null&&head.next==null){
                return true;
            }
            ListNode slow=head;
            ListNode fast=head;
            Stack<Integer> stk=new Stack<Integer>();
            stk.push(head.val);
            while(fast.next!=null&&fast.next.next!=null){
                slow=slow.next;
                fast=fast.next.next;
                stk.push(slow.val);
            }
            //链表长度为偶数
            if(fast.next!=null){
                slow=slow.next;
            }
            while(slow!=null){
                int tmp=stk.pop();
                if(slow.val!=tmp){
                    return false;
                }
                slow=slow.next;
            }
            return true;
        }
    }
    

    方法二:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isPalindrome(ListNode head) {
            //0个节点或是1个节点
            if(head==null||head!=null&&head.next==null){
                return true;
            }
            ListNode slow=head;
            ListNode fast=head;
            ListNode first=null;
            while(fast!=null&&fast.next!=null){
                first=slow;
                slow=slow.next;
                fast=fast.next.next;
            }
            fast=first.next;
            first.next=null;
            ListNode pre=null;
            ListNode next=null;
            while(fast!=null){
                next=fast.next;
                fast.next=pre;
                pre=fast;
                fast=next;
            }
            first=head;
            fast=pre;
            while(first!=null&&fast!=null){
                if(first.val!=fast.val){
                    return false;
                }
                first=first.next;
                fast=fast.next;
            }
            return true;
        }
    }
    

    C++实现:

    方法一:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            if(head==nullptr||head->next==nullptr)
            {
                return true;
            }
            ListNode *slow=head;
            ListNode *fast=head;
            stack<int> stk;
            stk.push(head->val);
            while(fast->next&&fast->next->next)
            {
                slow=slow->next;
                fast=fast->next->next;
                stk.push(slow->val);
            }
            if(!fast->next)
            {
                stk.pop();
            }
            while(slow->next)
            {
                slow=slow->next;
                int tmp=stk.top();
                if(slow->val!=tmp)
                {
                    return false;
                }
                stk.pop();
            }
            return true;
        }
    };
    

    方法二:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            if(!head||!head->next)
            {
                return true;
            }
            ListNode *slow=head;
            ListNode *fast=head;
            ListNode *first=nullptr;
            while(fast&&fast->next)
            {
                first=slow;
                slow=slow->next;
                fast=fast->next->next;
            }
            fast=first->next;
            first->next=nullptr;
            ListNode *pre=nullptr;
            ListNode *next=nullptr;
            while(fast)
            {
                next=fast->next;
                fast->next=pre;
                pre=fast;
                fast=next;
            }
            first=head,fast=pre;
            while(first&&fast)
            {
                if(first->val!=fast->val)
                {
                    return false;
                }
                first=first->next;
                fast=fast->next;
            }
            return true;
        }
    };
    

    参考:https://www.cnblogs.com/grandyang/p/4635425.html

  • 相关阅读:
    Java中单态设计模式
    Google地图,Baidu地图数据供应商
    栅格数据和矢量数据
    Java学习之Iterator(迭代器)的一般用法 (转)
    highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度
    relative、absolute和float
    【转】20个令人敬畏的jQuery插件
    启动tomcat显示成功,但是访问tomcat首页是404错误页
    手机测试Android程序
    Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8759212.html
Copyright © 2011-2022 走看看