タイトル説明
単一リンクリストを逆にします。
例:
入力: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;
}
運転結果