「Leetcode」206。逆リンクリスト

タイトル説明

単一リンクリストを逆にします。
例:
入力:1-> 2-> 3-> 4-> 5-> NULL
出力:5-> 4-> 3-> 2-> 1-> NULL

言語:C言語
思考分析
私が最初に考えた方法は、各ノードのデータを元のリンクリストに最後から最初まで保存し、新しいリンクリストを作成し、保存されたデータに基づいてノードを順番に作成することでした。 、そして最後に新しいリンクリストに戻ります。、そうするのは本当に面倒です。次の方法を使用してください。

  • prev、cur、nextの3つのポインターを作成し、cur = headを作成し、他の2つのポインターを空にします。
  • 中心となるアイデアは、1-> NULL、2-> 1,3-> 2,4-> 3,5-> 4 ...などにすることです。このとき、で作成された3つのポインターを使用する必要があります。前の1つとwhileループこのようにして、単一リンクリストを直接逆にすることができます
  • ループwhile(cur)が与えられた場合、最初のステップは次のポインターをcur-> next(次のノードの保存として機能)に等しくすることです。次に、2番目のステップはcurがprev(の最初のノード)を指すようにすることです。反転されていないリンクリスト)次のポインタは反転されたリンクリストの最後のノードを指します)、prevは最初は空であるため、最初のノードはNULLを指します。3番目のステップは、3つのポインタを順番に1ステップ後方に移動することです。 、操作は、反転されていないリンクリストの最初のノードです。サイクルが完了した後、リンクリストは反転されます。
  • 最後のループの後、curはNULLを指し、prevは元のリンクリストの最後のノードを指します。つまり、逆リンクリストの最初のノードを指します。これはヘッドに相当します。元のリンクリストのポインタ

コード

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

typedef struct ListNode Node;
struct ListNode* reverseList(struct ListNode* head){
    Node* prev = NULL;
    Node* cur= head;
    Node* next = NULL;

    while(cur)
    {
        next=cur->next;
        cur->next=prev;
        prev=cur;
        cur=next;
    }
    
    return prev;
}

運転結果
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/NanlinW/article/details/104784299