C言語回文チェーン表
1852 ワード
要求:チェーンテーブルが返信チェーンテーブルであるかどうかを判断してください.
例1:
例2:
bool isPalindrome(struct ListNode* head){
//特別な事情を排除する
if(head == NULL||head->next==NULL)
return true ;
if(head->next->next==NULL)
{
if(head->val==head->next->val)
return true ;
else
return false ;
}
//スローツーポインタを定義します.クイックポインタが移動したとき、スローポインタがチェーンテーブルの真ん中を指します.
struct ListNode* slowp=head->next ;//グリッドを移動するたびに
struct ListNode* fastp=head->next->next ;//毎回2つのグリッドを移動
while(fastp!=NULL && fastp->next!=NULL)
{
slowp=slowp->next ;
fastp=fastp->next->next;
}
//その後、中央部の前のチェーンテーブルを反転して、後続の比較を容易にする
struct ListNode* prev =NULL ;
struct ListNode* Temp =NULL ;
struct ListNode* curr =head;
//反転
while(curr!=slowp)
{
Temp =curr->next ;
curr->next =prev ;
prev = curr ;
curr = Temp ;
}
//奇数個の場合は真ん中のslowと比較する必要がないので1マス後ろに移動
if(fastp !=NULL && fastp->next==NULL)
{
slowp=slowp->next ;
}
//返信照合
while(prev!=NULL)
{
if(prev->val != slowp->val)
return false ;
prev=prev->next;
slowp=slowp->next;
}
return true;
}
例1:
: 1->2
: false
例2:
: 1->2->2->1
: true
: + +
: 。 1->1->2->1->1->NULL slow 2,fast 1, 2 prev 1,
slow 1 , while(prev!=NULL) 。
bool isPalindrome(struct ListNode* head){
//特別な事情を排除する
if(head == NULL||head->next==NULL)
return true ;
if(head->next->next==NULL)
{
if(head->val==head->next->val)
return true ;
else
return false ;
}
//スローツーポインタを定義します.クイックポインタが移動したとき、スローポインタがチェーンテーブルの真ん中を指します.
struct ListNode* slowp=head->next ;//グリッドを移動するたびに
struct ListNode* fastp=head->next->next ;//毎回2つのグリッドを移動
while(fastp!=NULL && fastp->next!=NULL)
{
slowp=slowp->next ;
fastp=fastp->next->next;
}
//その後、中央部の前のチェーンテーブルを反転して、後続の比較を容易にする
struct ListNode* prev =NULL ;
struct ListNode* Temp =NULL ;
struct ListNode* curr =head;
//反転
while(curr!=slowp)
{
Temp =curr->next ;
curr->next =prev ;
prev = curr ;
curr = Temp ;
}
//奇数個の場合は真ん中のslowと比較する必要がないので1マス後ろに移動
if(fastp !=NULL && fastp->next==NULL)
{
slowp=slowp->next ;
}
//返信照合
while(prev!=NULL)
{
if(prev->val != slowp->val)
return false ;
prev=prev->next;
slowp=slowp->next;
}
return true;
}