LeetCode刷题记录:234.回文链表-2020.04.10

LeetCode 234.回文链表

Requirement

请判断一个链表是否为回文链表。

示例

示例 1:
	输入: 1->2
	输出: false
	
示例 2:
	输入: 1->2->2->1
	输出: true

解题思路1

先遍历该链表,得到链表总长度,由此可得中间结点的位置.

重新遍历链表至中点为止,并用栈存储各结点的val值.

从中点向后继续遍历,指针每向后一步,弹出栈顶的值与指针当前结点的val值比对,若相同,则继续,若不相同,则不是回文链表,退出循环,返回false.

遍历完后,则前半链表与后半链表结点依次反向对应,则是回文链表,返回true.

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    int isPalindrome(ListNode* head) 
    {
        long length = 0;
        ListNode* temp = head;
        while(temp != nullptr)//求出链表的总长度
        {
            length ++;
            temp = temp -> next;
        }
        int half = length / 2;
        temp = head;                //temp重新指向头结点,重新开始遍历
        stack<int> stack;
        for(int i = 0; i < half; i++)
        {
            stack.push(temp -> val);
            temp = temp -> next;
        }
        bool palindrome = true;
        switch (length % 2)
        {
            case 0:
            {
                while(palindrome && temp != nullptr)
                {
                    int tmp = stack.top();
                    stack.pop();
                    if(tmp != temp -> val)
                    {
                        palindrome = false;
                    }
                    temp = temp -> next;
                }
                break;
            }
            case 1:
            {
                temp = temp -> next;    //列表最中间单独的一个元素不处理
                while(palindrome && temp != nullptr)
                {
                    int tmp = stack.top();
                    stack.pop();
                    if(tmp != temp -> val)
                    {
                        palindrome = false;
                    }
                    temp = temp -> next;
                }
                break;
            }
        }
        return palindrome;
    }
};

Assessment

LeetCode刷题记录:234.回文链表-2020.04.10_第1张图片

Remark

是个方法,但时间空间复杂度均为O(n),应该还有更高效的方法.

也可用快慢指针法实现.

你可能感兴趣的:(LeetCode)