[アルゴリズムの問題]リンクリストを逆にする2つの方法

単一リンクリストを逆にする2つの方法

方法1:

まず、5つの要素で単一リンクリストを作成し、3つのポインターを定義します。curとnextはそれぞれ、ヘッドノードとその次のノードであるnewheadポインターを指し、新しいヘッドノードを格納します(newheadの初期値はNULLです)。

図に示すように:

ここに画像の説明を挿入

2番目のステップは、cur-> newheadの横をポイントし、curの値をnewheadに割り当ててから、前後に移動します。このとき、curは番号2を指し、次のポイントは3を指します(次のようになります)。図:(このステップは切断されています1と2、1の間の接続が新しいヘッドノードになります。単一リンクリストのヘッド挿入と同様に、このステップを繰り返します)

ここに画像の説明を挿入

次のサイクルステップは、写真で示されています。

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入

最後のステップで、curはNULLを指し、ループは終了します。この時点で、newheadは反転リストのヘッドノードです。

以下は、特定のコード実装です:(単一リンクリスト構造の定義は含まれていません)

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode*cur;
    struct ListNode*next;
    struct ListNode*newhead=NULL;
    cur=head;
    while(cur)
    {
        next=cur->next;
        
        cur->next=newhead;
        newhead=cur;
        cur=next;
    }
    return newhead;

}

方法2

2番目の方法は最初の方法よりも理解しやすいです。3つのポインターn1、n2、n3、n1の初期値はNULL、n2はリンクリストのヘッドノード、n3はn2の次のノードです。下の図。:
ここに画像の説明を挿入

次の手順は方法1と同様で、図に示すように、n2とn3の間の接続を切断し、n2がn1を指すようにしてから、n1、n2、n3を更新します。
ここに画像の説明を挿入

次に、n2がNULLの終わりを指し、n1が反転後のリンクリストのヘッドノードになるまでループを続けます。

コードは次のように表示されます。

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode*n1,*n2,*n3;
    n1=NULl;
    n2=head;
    n3=n2->next;
    while(n2)
    {
        n2-next=n1;
        n1=n2;
        n2=n3;
        if(n3)   //判断n3是否存在,若不存在则无需后续操作
            n3=n3->next;
    }
    return n1;
}
3;
        if(n3)   //判断n3是否存在,若不存在则无需后续操作
            n3=n3->next;
    }
    return n1;
}

最後に、このトピックのleetcodeリンクを添付します。LeetCodeReversalSingly Linked List(単一リンクリストの構造の特定の定義が含まれています)

おすすめ

転載: blog.csdn.net/weixin_43962381/article/details/111247167