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