题解 | #判断一个链表是否为回文结构#

判断一个链表是否为回文结构

https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f

方法一:使用双指针、反转链表求解(推荐)

如果一个链表为回文结构,则链表的前半段和后半段是对称的。

1、利用两个指针(快指针、慢指针),快指针每次移动两个结点,慢指针每次移动一个结点,可以得到链表的中间结点;

2、得到链表的中间结点,从中间结点开始将后续的链表进行反转;

3、比较链表前半段和后半段的值是否对称。

时间复杂度:o(n)

空间复杂度:o(1)

class Solution {
  public:
    //反转链表
    ListNode* reverse(ListNode* phead) {
        ListNode* ptemp = nullptr;
        while (phead) {
            ListNode* pnext = phead->next;
            phead->next = ptemp;
            ptemp = phead;
            phead = pnext;
        }
        return ptemp;
    }

    bool isPail(ListNode* head) {
        //特殊情况处理
        if (head == nullptr || head->next == nullptr)
            return true;

        ListNode* slow = head;
        ListNode* fast = head;
        //得到链表的中点
        while (fast != nullptr && fast->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;
        }
        //从链表中点开始反转链表
        ListNode* pend = reverse(slow);
        //前半段链表和后半段链表进行对比是否对称
        while (pend != nullptr) {
            if (pend->val != head->val)
                return false;
            pend = pend->next;
            head = head->next;
        }
        return true;
    }
};

方法二:利用栈求解

利用栈先进后出的特点将链表存进栈中,再对比链表和栈的值即可判断是否为回文结构

时间复杂度:o(n)

空间复杂度:o(n)

class Solution {
public:
    bool isPail(ListNode* head) {
        //特殊情况处理
        if (head == nullptr || head->next == nullptr)
            return true;

        stack<ListNode*> sk;
        ListNode* ptemp = head;
        while (ptemp) {
            sk.push(ptemp);
            ptemp = ptemp->next;
        }

        while (head) {
            if((head->val) != (sk.top()->val))
                return false;
            head = head->next;
            sk.pop();
        }
        return true;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务