题解 | #链表的回文结构#

题目:链表的回文结构_牛客题霸_牛客网

大致思路:将中间结点之后的节点翻转,然后用一个头指针head和一个尾指针tail分别从前面和后面往中间遍历并进行值的比较。

步骤:求节点个数以及尾节点(最后比较用)->用节点个数的数学关系求翻转处的位置->将cur置于翻转处,prev记录cur前一个节点,next记录cur下一个结点->用三个指针将中间之后的节点进行翻转->最后从前后往中间遍历比较val。

贴上代码

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        //一个节点为回文直接返回
        if(A->next==NULL){
            return true;
        }
        //找尾节点顺便求长度
        ListNode* tail=A;
        int len=1;
        while(tail->next){
            len++;
            tail=tail->next;
        }
        //找翻转节点处
        int pos=0;
        if(len%2==0){
            pos=len/2+1;
        }else{
            pos=len/2+2;
        }
        //将cur置于翻转处
        ListNode* prev=NULL;
        ListNode* cur=A;
        ListNode* next=cur->next;
        while(--pos){
            prev=cur;
            cur=next;
            next=next->next;
        }
        //进行翻转
        while(true){
            cur->next=prev;
            if(next==NULL){
                break;
            }
            prev=cur;
            cur=next;
            next=next->next;
        }
        //头尾比较
        ListNode* head=A;
        len=len/2;
        while(len--){
            if(head->val!=tail->val){
                return false;
            }
        }
        return true;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值