/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include <algorithm>
#include <iterator>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// write code here
//链表元素赋值到正向数组内
vector <int> pos;
while(head != NULL){
pos.push_back(head->val);
head = head->next;
}
//置换颠倒数组变成反向数组
vector <int> neg = pos;
reverse(neg.begin(),neg.end());
for(int i = 0; i < neg.size(); i++){
cout<<neg[i];
}
//比较正反两个数组遍历结果是否一样
for(int i = 0; i < neg.size(); i++){
cout<<neg[i];
if(pos[i] != neg[i])
return false;
}
return true;
}
};
- 这段代码的时间复杂度为O(n),其中n是链表的长度。代码首先将链表的元素赋值到正向数组`pos`中,然后通过`reverse`函数将`pos`数组颠倒得到反向数组`neg`,最后比较正反两个数组的遍历结果是否一样。
- 空间复杂度为O(n),其中n是链表的长度。代码使用了两个数组`pos`和`neg`来存储链表的元素。
- 算法思想是将链表的元素存储到数组中,然后通过反转数组的方式得到反向数组,最后比较正反两个数组的遍历结果是否一样,从而判断链表是否是回文的。