Leetcode234:回文链表(简单)
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
链表中节点数目在范围[1, 105] 内 0 <= Node.val <= 9
暴力
赋值数组(通过头尾)
bool isPalindrome(struct ListNode* head){
int a[200000];
int i=0;
struct ListNode *p=head;
while(p)
{
a[i++] = p->val;
p=p->next;
}
int begin=0,last = i-1;
while(begin<last)
{
if(a[begin]!=a[last]) return false;
else
{
begin++;
last--;
}
}
return true;
}
时间复杂度:O(n)
空间复杂度:O(n)
反转回文
struct ListNode* reverseList(struct ListNode* head);
bool isPalindrome(struct ListNode* head){
struct ListNode *twostep,*onstep;
twostep=head;onstep=head;
while(twostep && twostep->next)
{
twostep = twostep->next->next;
onstep=onstep->next;
}
if(twostep) onstep=onstep->next;
onstep = reverseList(onstep);
twostep = head;
while(onstep)
{
if(twostep->val!=onstep->val) return false;
twostep=twostep->next;
onstep=onstep->next;
}
return true;
}
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *pre,*cur;
pre=NULL;
cur = head;
while(cur)
{
struct ListNode *curnext = cur->next;
cur->next = pre;
pre=cur;
cur = curnext;
}
return pre;
}
时间复杂度:O(n)
空间复杂度:O(1)
|