LeetCode 234.回文链表(快慢指针+反转单链表)

题目描述:来自LeetCode

 思路:回文链表就是链表两边关于中间对称,那如果对称就是回文链表了,想要判断两边是否对称就要对两边一一比较,所以第一件事就是要找到中间结点,如何确定中间结点的位置?快慢指针呀!快指针每次走两步,慢指针每次走一步,当快指针都到链表最后的时候,慢指针走到中间结点。如何比较呢,因为是关于中心对称,所以前面的从左往右和后面的从右往左是一样的,那我们可以就可以将后面的链表逆序,然后得到后面链表逆序之后的首结点,就可以和前面的链表开始比较了。还有关于链表结点个数是奇还是偶的问题,如果是奇数,中间结点不比较,如果是偶数则全部比较,那我们怎样区分呢?其实将中间那个结点放在前面就行,当后面的链表为空的时候我们就不判断了,这样的话,如果是奇数,前面最后一个结点就不会参与比较了。

关于快慢指针,给大家来个图解吧!

奇数情况:

 

 

这时候fast不满足条件fast->next!=NULL&&fast->next->next!=NULL,退出快慢指针的移动,慢指针就移动到了中间。 

偶数情况:

 

 

这个时候,fast不满足条件fast->next!=NULL&&fast->next->next!=NULL,退出快慢指针的移动,慢指针就移动到了前面的结尾。 

代码实现C++:

 bool isPalindrome(ListNode* head) {
        if(head==NULL||head->next==NULL) return true;
        ListNode *fast=head,*slow=head;
        while(fast->next!=NULL&&fast->next->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode * newhead=reverse(slow->next);
        while(newhead!=NULL){
            if(newhead->val!=head->val){
                return false;
            }
            newhead=newhead->next;
            head=head->next;
        }
        return true;
    }
    ListNode *reverse(ListNode *newhead){
        ListNode *p=newhead->next,*s=newhead,*q=newhead;
        newhead->next=NULL;
        while(p){
            s=p;
            p=p->next;
            s->next=newhead;
            newhead=s;
        }
        return newhead;
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值