BM13 判断一个链表是否为回文结构
知识点链表双指针
描述
给定一个链表,请判断该链表是否为回文结构。回文是指该字符串正序逆序完全一致。数据范围: 链表节点数 ,链表中每个节点的值满足
示例1
输入:
{1}
复制返回值:
true
复制
示例2
输入:
{2,1}
复制返回值:
false
复制说明:
2->1
示例3
输入:
{1,2,2,1}
复制返回值:
true
复制说明:
1->2->2->1
题解
思路:
如果将链表换成数组,那么判断一个数组是否为回文将是一件很简单的事情。另外,如果我们可以找到链表的中间节点,然后将后面的所有节点反转,那么从链表头、尾分别出发直到相遇时两个链表的值都相等的话则也是回文。据此有以下几种方法:
- 1. 使用数组存放所有节点,然后使用数组回文的方式判断链表是否为回文
- 2. 借助于栈,将链表的所有节点依次入栈,然后再取出所有节点,将这些节点依次和链表对比
- 3. 将链表反转,然后比较2个节点的所有值是否相等
- 4. 找到中间节点,然后将后面的节点反转,再从头节点和中间节点开始判断是否所有的值都相等
以下为借助数组的实现:
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;
}