再帰と非再帰を使用したシングルチェーンリバーサルの詳細な説明

韦小宝
リリース: 2023-03-21 11:44:02
オリジナル
1531 人が閲覧しました

この記事では、再帰と非再帰を使用してシングルチェーン反転を実現する方法について説明します。シングルチェーン反転とは何かを知らない学生も多いかもしれないので、ナンセンスをカットしてこの記事を直接読みましょう。
この質問は、再帰アルゴリズムと反復アルゴリズムの両方を使用できることを示唆しています。
私は再帰について深く理解していないため、最初に反復を使用してアルゴリズムを作成します。
質問のアイデア: から開始します。ヘッドノードを逆方向にトラバースし、ノード間のチェーンの反転を順番に 1 つずつ実装します。
最初に 2 つのポインターを使用して操作を完了しようとしましたが、失敗しました

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
ListNode* pre = NULL;
  while(head -> next)
  {
 pre = head;
 head = head -> next;
 head -> next = pre; 
  }
  return head;
};
ログイン後にコピー

理由は次のとおりです: 反転プロセス中に head ->next が反転され、後方へのトラバースを続けることができないため、ポインターを追加しました操作

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
ListNode* pre = NULL;
  while(head)
  {
 ListNode* next = head -> next;
 head -> next = pre;//head是尾结点,指针置空
 head = next;
 pre = head; 
  }
  return pre;           //head = NULL
};
ログイン後にコピー

は再帰的に機能しません。理解するには、ディスカッションを参照してください。
考え方は次のとおりです。再帰により、終了条件 (末尾ノードに到達したら停止) が達成されるまで、先頭ノードが継続的に逆方向にトラバースされます。
コードは次のとおりです:

class Solution {
public:       
ListNode* reverseList(ListNode* head) { 
//终止条件,达到尾结点停止
if(head == NULL || head ==NULL)
return head;
else
{
//头结点向后移动
ListNode* temp = reverList(head->next);
head->next->next = head;   //1
head->next = NULL;         //2
}
return temp;
};
ログイン後にコピー

再帰終了条件に到達したときに表示されるステータスは次のとおりです:




再帰の前のレベルに戻った後のステータスは、


passed 1 と 2 の 2 行のコードをコメントした後のステータスは次のようになります


ヘッド ノードの位置が番号に関連していることがわかります。再帰レベルの値と、反転後のヘッド ノードとしての temp は決して移動しないため、反転ターン効果が得られます。 再帰的なコードは理解できましたが、どのように設計すればよいのかはまだ分からず、まだまだ初心者です。

関連記事:

PHP実装シングルチェーンテーブル反転操作例



以上が再帰と非再帰を使用したシングルチェーンリバーサルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!