鏈表迴文的leetcode-cn.com

使用快慢指針解決判段鏈表迴文問題
使用快慢指針能精準定位到表中的幾分之幾;指針

/**
 * 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;
}
相關文章
相關標籤/搜索