链表的回文结构_牛客题霸_牛客网对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为。题目来自【牛客题霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa思路1:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
int left = 0;
int right = 0;
// write code here
//创建数组
int count = 0;
//创建数组
int arr[900];
ListNode* ptail = A;
//将链表中的数据插入到数组里面以及计算链表的个数
while(A)
{
arr[count++] = A->val;
A = A->next;
}
//下标是从0开始的
right = count-1;
//比较是否为回文结构
while(left++ < right--)
{
if(arr[left] != arr[right])
{
return false;
}
}
return true;
}
};
提交结果:
在代码中我们申请了900个整型的数组,因为我们知道链表最大是900个节点,这里的空间复杂度也是O(1),复合要求,那如果这里没有对链表节点个数进行限制,这种思路肯定是不行的。
除此之外,该思路只能在牛客上通过,若换成力扣,通过不了,因为如果明确规定空间复杂度为O(1)的话就不能额外的去申请空间,更别说申请900个整型了,牛客平台对时间和空间复杂度没有力扣那么严格。
思路2:
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
//C++和C在这里唯一的区别就是不需要再typedef
//typedef struct ListNode ListNode; - 不用
class PalindromeList {
public:
ListNode* reveres(ListNode* A)
{
ListNode* prev = NULL;
ListNode* ptail = A;
ListNode* next = A->next;
while(ptail)
{
ptail->next = prev;
prev = ptail;
ptail = next;
next = next->next;
}
return prev;
}
bool chkPalindrome(ListNode* A) {
// write code here
//找中间节点
ListNode* fast = A;
ListNode* slow = A;
while(slow && slow->next)
{
fast = fast->next;
slow = slow->next->next;
}
//fast就是中间节点
ListNode* right = reveres(fast);//逆置并返回逆置后的第一个节点
ListNode* left = A;
while(right)
{
if(right->val != left->val)
{
return false;
}
right = right->next;
left = left->next;
}
return true;
}
};
提交结果: