234 Palindrome Linked List 回文链表

Posted lina2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于234 Palindrome Linked List 回文链表的主要内容,如果未能解决你的问题,请参考以下文章

LC.234.Palindrome Linked List

234. Palindrome Linked List

Leetcode 234. Palindrome Linked List

234. Palindrome Linked List

234. Palindrome Linked List

java 234. Palindrome Linked List(#)。java