给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
思考:
该问题的关键点在于对于回文链表的理解,回文链表是一种特殊的链表,它从前往后和从后往前读都是相同的序列。换句话说,这个链表的元素顺序是对称的。我们可以根据对称这个特性,借助双指针对回文链表进行循环对比,如果两端对称相等,那么自然就是回文链表。
需要使用双指针进行循环对比,那么就需要两个对象,因此我们首先遍历循环给定的链表,使用数组存储链表中的值,然后再使用链表与数组进行对比得出结论。
对于emplace_back以及push_back函数的区别如下,其实本文中哪个都可以
push_back: 这个函数接受一个已经构造好的对象作为参数,并将其添加到向量的末尾。如果传入的参数是一个右值(例如一个临时对象或使用 std::move 转换的对象),那么 push_back 会使用移动构造函数来添加元素,这通常比拷贝构造更高效。如果传入的是一个左值(例如一个变量),那么它会使用拷贝构造函数来添加元素。 emplace_back: 这个函数可以接受多个参数,这些参数是新元素类型的构造函数所需要的。emplace_back 会在向量的末尾直接构造元素,而不是先构造一个临时对象然后再拷贝或移动到向量中。这意味着 emplace_back 可以避免临时对象的创建和销毁,从而提高效率,尤其是对于那些构造成本较高的对象。
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> vals;
while( head != nullptr)
{
vals.emplace_back(head ->val);
head = head -> next;
}
for( int i = 0,j = (int)vals.size() -1;i < j;++ i ,--j)
{
if(vals[i] != vals[j])
{
return false;
}
}
return true;
}
};