前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >链表的回文结构

链表的回文结构

作者头像
一枕眠秋雨
发布2024-03-11 18:13:51
720
发布2024-03-11 18:13:51
举报
文章被收录于专栏:司钰秘籍司钰秘籍

一.题目及剖析

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tab=note

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

代码语言:javascript
复制
1->2->2->1
代码语言:javascript
复制
返回:true

众所周知,如果这道题的链表改为数组,这道题将十分简单,用左右指针就行,但人家说的是链表,显然左右指针是行不通的.

二.思路引入

1.找到链表的中间节点,将其分为两部分

2.将后半部分反转

3.如果反转后value与前半部分一样,则是回文结构

而前两步之前的我的博客有介绍

三.代码引入

代码语言:javascript
复制
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    struct ListNode* intermediateNode(struct ListNode* head)
    {
        struct ListNode* slow, *fast;
        slow = fast = head;
        while(fast && fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }
    struct ListNode* overturnList(struct ListNode* head)
    {
        struct ListNode *n1, *n2, *n3;
        n1 = NULL;
        n2 = n3 = head;
        if(head)
        n3 = head->next;
        while(n2)
        {
            n2->next = n1;
            n1 = n2;
            n2 = n3;
            if(n3)
            n3 = n3->next;
        }
        return n1;
    }
    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode* pcur = intermediateNode(A);
        struct ListNode* prev = overturnList(pcur);
        while(prev)
        {
            if(A->val != prev->val)
            return false;
            prev = prev->next;
            A = A->next;
        }
        return true;
    }
};

四.扩展

当然对于这道题,我们还可以有其他的解法,比如遍历这个链表,将其中的value存放至一个数组中,然后我们就可以使用左右指针去解决,这个算法的时间复杂度是o(n+logn),而第一种方法的时间复杂度是o(n)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.题目及剖析
    • 描述
    • 二.思路引入
    • 三.代码引入
    • 四.扩展
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档