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

链表的回文结构

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

大致思路:将中间结点之后的节点翻转,然后用一个头指针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 收藏 评论
分享
牛客网
牛客企业服务