使用快慢指針解決判段鏈表迴文問題
使用快慢指針能精準定位到表中的幾分之幾;指針
/** * 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; }