LeetCode每日一题Day3:回文链表

LeetCode每日一题Day3:回文链表_第1张图片

题目描述

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

示例 1:

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

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

刚开始的时候想的是把链表中的数据存入栈中,然后从链表头部开始与栈顶元素比较,若相同则继续比较,否则输出false,思路很简单,代码如下:

/**
 * 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==NULL)
            return true;
        stack<int>copyoflist;
        ListNode* temp=head;
        int i=0;
        while(temp != NULL){//将链表存入栈中
            copyoflist.push(temp->val);
            temp=temp->next;
            i++;
        }
        temp=head;
        int j=0;
        while(j <= i/2){//
            if(temp->val==copyoflist.top()){//将链表前半部分与后半部分相比较
                temp=temp->next;
                copyoflist.pop();
                j++;
            }
            else
                return false;
        }
        return true;
    }
};

结果如下,时间性能还好,空间性能非常差。
LeetCode每日一题Day3:回文链表_第2张图片
为了改善空间性能,决定首先找到链表的中间位置,然后将链表的前半部分逆序,逆序之后与链表剩余的后半部分逐个比较。代码如下:

/**
 * 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) {
        ListNode* tra=head;
        int i=0,j=0;
        while(tra !=NULL){//计算元素数目
            tra=tra->next;
            i++;
        }
        ListNode* newhead=NULL;
        ListNode*temp;
        tra=head;
        while(j<i/2){//逆序
            temp=newhead;
            newhead=tra;
            tra=tra->next;
            newhead->next=temp;
            j++;
        }
        if(i%2!=0){ //跳过奇数个元素中间的元素
            tra=tra->next;
            j++;
        }
        while(j<i){//逐元素比较
            if(newhead->val==tra->val){
                newhead=newhead->next;
                tra=tra->next;
                j++;
            }
            else
                return false;
        }
        return true;

    }
};

一番操作下来,空间性能也有所提高:
LeetCode每日一题Day3:回文链表_第3张图片
继续加油!晚安

你可能感兴趣的:(LeetCode,算法,链表)