チェーンテーブルの中間ノードポインタを指定し、中間ノードを削除する方法

694 ワード

問題は次のとおりです.
入力:チェーンテーブルa->b->c->d->eのノードcへのポインタ
出力:戻り値はありませんが、新しいチェーンテーブルはa->b->d->eになります.
回答:
長い間考えていなかったので,ヒントを見てやっと解法が分かった.ここでは小さなテクニックを使いました.中間ノードを削除するには、ノードの前のノードpを削除することが分からないので、ポインタを修正する方法(p->next=del->next)でノードを削除することはできませんが、ノードの後のノードを削除することを知っているので、削除するノードのデータをそのノードの後のノードのデータと交換し、後のノードを削除する考えを変えて、目的を達成する.しかし、この方法では最後のノードを削除することはできません.理由は明らかです.
 
  
// a tricky solution,can't delete the last one element
int delete_node(NODE* node) {
  int data;
  NODE *p=node->next;
   node->data=p->data;
   node->next=p->next;
  free(p);
}