• 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

  • 相关阅读:
    bash while until 循环用法
    微信小程序入门介绍
    jquery遍历
    jquery获取元素和DOM获取元素
    ul在div中水平居中效果
    一个文字在一个图片上水平居中,并且悬浮变大特效
    一个div在另一个div中垂直居中的方法
    layer插件的使用
    百度分享插件使用
    图标字体
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8759212.html
Copyright © 2020-2023  润新知