2020-10-23 第4题

2020-10-23 第4题

题目来源:leetcode 每日一题

234. 回文链表

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

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

  看到是一个简单题,没考虑怎么写时空复杂度会低,直接采用最简单的方法写。我的思路是:这个主要是对称,会有奇数和偶数的区别。但实际上写的时候发现好像没区别,因为长度除以2以后奇数并不会判断中间那个数字,所以奇偶都一样,只要两边对称的数字相同就行,也就是i和node.size()-1-i相同就行。
  写的时候我不知道能不能直接对链表进行操作,保险起见还是将链表中的节点进行导出,存放到vector中了。然后判断对称位置value是否相同。如果不同直接return false。
  写的时候我觉得我的逻辑必然没有问题,事实证明确实没有,因为题目很简单,但是一开始还是出错,因为在取前半部分字符的时候for循环的终止条件写为(node.size()-1)/2,当时考虑如果只有2个字符那么终止条件是i<0.5,能正常进循环,但实际情况是除法默认取整,也就是i<0,循环就进不了。思考过后我认为条件可以直接写成node.size()/2,因为这样计算4和5字符要判断的都是两组字符(默认取整),符合我的想法,所以就这么改了,然后正确。
  代码如下:

/**
 * 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)return true;
        ListNode* cur=head;
        vector<ListNode*>node;
        int i,flag=0;
        
        while(cur)55jee                                                                                                                                y55,j  h
        {
            node.push_back(cur);
            cur=cur->next;
            //cout<<node.size()<<endl;
        }
        for(i=0;i<node.size()/2;i++)
        {
           // cout<<node[i]<<' '<<node[i+1]<<endl;
            if(node[i]->val!=node[node.size()-1-i]->val)
            {
                //cout<<'?'<<endl;
                return false;
            }
        }
        return true;
    }
};

运行结果如下
在这里插入图片描述

一会儿学习别人的解题思路:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值