当前位置: 代码迷 >> 综合 >> 【NowCoder.链表.OR36】链表的回文结构,多个知识点,含如何找到链表中间节点,如何翻转链表
  详细解决方案

【NowCoder.链表.OR36】链表的回文结构,多个知识点,含如何找到链表中间节点,如何翻转链表

热度:73   发布时间:2023-11-28 01:21:46.0

链表的回文结构


文章目录

  • 链表的回文结构
    • 一、题目
    • 二、思路分析


一、题目

?题目指路:OR36 链表的回文结构_牛客题霸_ 牛客网 (nowcoder.com)

?描述

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

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

?测试样例:

1->2->2->1
返回:true

二、思路分析

??我们需要找到中间的数的地址

?存在两种情况:

  • ?偶数个节点

在这里插入图片描述

  • ?奇数个节点

在这里插入图片描述

??fast->next = NULL 或 fast = NULL 结束循环??


?找到中间点之后,翻转之后的节点链接

在这里插入图片描述

??可以参考之前的文章:【LeetCode·单链表.206】反转链表??

翻转链表至下图样子

  • ?奇数比较:

在这里插入图片描述

  • ?偶数比较:

在这里插入图片描述

??方块是比较顺序??

?代码如下?

class PalindromeList {
public:bool chkPalindrome(ListNode* A) {ListNode* slow = A;ListNode* fast = A;while(fast->next && fast){fast = fast->next->next;slow = slow->next;}ListNode* cur = slow;ListNode* tail = NULL;ListNode* newnode = NULL;while(cur){newnode = cur;cur = cur->next;newnode->next = tail;tail = newnode;}ListNode* curA = A;ListNode* curR = newnode;while(curA && curR){if(curA->val != curR->val){return false;}curA = curA->next;curR = curR->next;}return true;}
};

  相关解决方案