C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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, ]

  1. C++でのリンクリストのフラット化

    この問題では、右と下の2つのポインタノードで構成されるリンクリストが表示されます。 右ノード はメインのリンクリストポインタです。 ダウンノード そのノードで始まるセカンダリリンクリスト用です。 リンクリストはすべて並べ替えられています。 私たちのタスクは、リンクリストをフラット化するプログラムを作成することであり、結果のリスト自体がソートされたリストになります。 問題を理解するために例を見てみましょう 入力 出力 1-> 9-> 8 -> 4 -> 6-> 7-> 2-> 3-> 5 ソリューションアプロー

  2. C++のリンクリストの代替ノードの合計

    この問題では、リンクリストが表示されます。私たちのタスクは、リンクリストの代替ノードの合計を出力することです。 リンクリストは、リンクを介して相互に接続された一連のデータ構造です。 では、問題に戻りましょう。ここでは、リンクリストの代替ノードを追加します。これは、ノードが位置0、2、4、6、…であることを追加することを意味します 問題を理解するために例を見てみましょう。 入力 4 → 12 → 10 → 76 → 9 → 26 → 1 出力 24 説明 considering alternate strings