0
点赞
收藏
分享

微信扫一扫

[链表]BM13 判断一个链表是否为回文结构-简单

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

知识点​​链表​​​​双指针​​

描述

给定一个链表,请判断该链表是否为回文结构。回文是指该字符串正序逆序完全一致。数据范围: 链表节点数 [链表]BM13 判断一个链表是否为回文结构-简单_数组,链表中每个节点的值满足 [链表]BM13 判断一个链表是否为回文结构-简单_数组_02

示例1

输入:

{1}

复制返回值:

true

复制

示例2

输入:

{2,1}

复制返回值:

false

复制说明:

2->1

示例3

输入:

{1,2,2,1}

复制返回值:

true

复制说明:

1->2->2->1


题解

思路:

如果将链表换成数组,那么判断一个数组是否为回文将是一件很简单的事情。另外,如果我们可以找到链表的中间节点,然后将后面的所有节点反转,那么从链表头、尾分别出发直到相遇时两个链表的值都相等的话则也是回文。据此有以下几种方法:

  • 1. 使用数组存放所有节点,然后使用数组回文的方式判断链表是否为回文
  • 2. 借助于栈,将链表的所有节点依次入栈,然后再取出所有节点,将这些节点依次和链表对比
  • 3. 将链表反转,然后比较2个节点的所有值是否相等
  • 4. 找到中间节点,然后将后面的节点反转,再从头节点和中间节点开始判断是否所有的值都相等

以下为借助数组的实现:

#include <bits/stdc++.h>

struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(nullptr)
{
}
ListNode() = default;
};

bool isPail(ListNode *head)
{
std::vector<ListNode *> v;
auto node = head;
while (node != nullptr)
{
v.push_back(node);
node = node->next;
}

for (int i = 0; i < v.size() / 2; ++i)
{
if (v[i]->val != v[v.size() - 1 - i]->val)
{
return false;
}
}
return true;
}


举报

相关推荐

0 条评论