C++の逆リンクリストII
リンクリストがあるとします。ノードを位置mからnに反転する必要があります。 1回のパスで実行する必要があります。したがって、リストが[1,2,3,4,5]で、m=2およびn=4の場合、結果は[1,4、、3,2,5]
になります。手順を見てみましょう-
- 2つのメソッド、reverseN()とreverseBetween()があります。 reverseBetween()はメインメソッドとして機能します。
- successorと呼ばれる1つのリンクノードポインタをnullとして定義します
- reverseNは次のように機能します-
- n =1の場合、後継者:=頭の次、頭を返す
- last =reverseN(next of head、n-1)
- next of(next of head)=head、next of head:=後継者、最後に戻る
- reverseBetween()メソッドは次のようになります-
- m =1の場合、reverseN(head、n)を返します
- 次の頭:=reverseBetween(次の頭、m – 1、n – 1)
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class ListNode{ public: int val; ListNode *next; ListNode(int data){ val = data; next = NULL; } }; ListNode *make_list(vector<int> v){ ListNode *head = new ListNode(v[0]); for(int i = 1; i<v.size(); i++){ ListNode *ptr = head; while(ptr->next != NULL){ ptr = ptr->next; } ptr->next = new ListNode(v[i]); } return head; } void print_list(ListNode *head){ ListNode *ptr = head; cout << "["; while(ptr){ cout << ptr->val << ", "; ptr = ptr->next; } cout << "]" << endl; } class Solution { public: ListNode* successor = NULL; ListNode* reverseN(ListNode* head, int n ){ if(n == 1){ successor = head->next; return head; } ListNode* last = reverseN(head->next, n - 1); head->next->next = head; head->next = successor; return last; } ListNode* reverseBetween(ListNode* head, int m, int n) { if(m == 1){ return reverseN(head, n); } head->next = reverseBetween(head->next, m - 1, n - 1); return head; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,7,8}; ListNode *head = make_list(v); print_list(ob.reverseBetween(head, 2, 6)); }
入力
[1,2,3,4,5,6,7,8] 2 6
出力
[1, 6, 5, 4, 3, 2, 7, 8, ]
-
C++でのリンクリストのフラット化
この問題では、右と下の2つのポインタノードで構成されるリンクリストが表示されます。 右ノード はメインのリンクリストポインタです。 ダウンノード そのノードで始まるセカンダリリンクリスト用です。 リンクリストはすべて並べ替えられています。 私たちのタスクは、リンクリストをフラット化するプログラムを作成することであり、結果のリスト自体がソートされたリストになります。 問題を理解するために例を見てみましょう 入力 出力 1-> 9-> 8 -> 4 -> 6-> 7-> 2-> 3-> 5 ソリューションアプロー
-
C++のリンクリストの代替ノードの合計
この問題では、リンクリストが表示されます。私たちのタスクは、リンクリストの代替ノードの合計を出力することです。 リンクリストは、リンクを介して相互に接続された一連のデータ構造です。 では、問題に戻りましょう。ここでは、リンクリストの代替ノードを追加します。これは、ノードが位置0、2、4、6、…であることを追加することを意味します 問題を理解するために例を見てみましょう。 入力 4 → 12 → 10 → 76 → 9 → 26 → 1 出力 24 説明 considering alternate strings