使用快慢指针解决判段链表回文问题
使用快慢指针能精准定位到表中的几分之几;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

bool isPalindrome(struct ListNode* head){
    if(head==0) 
    return true;
    struct ListNode* slow_p=head,* p=head;
    
    //找到链表的中间节点。
    while(p->next!=NULL&&p->next->next!=NULL){ //走两步与走一步之差为中点;
        slow_p=slow_p->next;
        p=p->next->next;
    }
    //当以p->next=NULL 结尾是为奇数
    // 当以p->next->next=NULL结尾时为偶数;
    //将链表分成两半。其中if语句处理链表长度为奇数的情况。
    struct ListNode* head_=slow_p->next; //重定义头;

  //奇数时p->next==NULL;
    if(p->next==NULL){ 

        head_=malloc(sizeof(struct ListNode));
        head_->val=slow_p->val;
        head_->next=slow_p->next;
    }
    slow_p->next=0;
    
    //将第二个链表反转;
    p=head_;
    while(p->next!=0){

        slow_p=head_;
        head_=p->next;  //将头往后移动;

        p->next=p->next->next;//先删除

        head_->next=slow_p; //尾插法; 
    }
    
    //按顺序比较两链表val值。
    while(head!=0){
        if(head->val!=head_->val) return false;
        head=head->next;
        head_=head_->next;
    }
    return true;
}



黑白
144 声望0 粉丝