C++でリストを回転
リンクリストがあるとします。リストを右にk桁回転させる必要があります。 kの値は負ではありません。したがって、リストが[1,23,4,5、NULL]のようで、k =2の場合、出力は[4,5,1,2,3、NULL]
になります。手順を見てみましょう-
- リストが空の場合は、nullを返します
- len:=1
- tail:=headという1つのノードを作成します
- テールの次はnullではありません
- lenを1増やします
- テール:=テールの次
- 尻尾の次:=頭
- k:=k mod len
- newHead:=null
- for i:=0からlen– k
- テール:=テールの次
- newHead:=尾の次
- テールの次:=null
- newHeadを返す
理解を深めるために、次の実装を見てみましょう-
例
#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->next){
cout << ptr->val << ", ";
ptr = ptr->next;
}
cout << "]" << endl;
}
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head) return head;
int len = 1;
ListNode* tail = head;
while(tail->next){
len++;
tail = tail->next;
}
tail->next = head;
k %= len;
ListNode* newHead = NULL;
for(int i = 0; i < len - k; i++){
tail = tail->next;
}
newHead = tail->next;
tail->next = NULL;
return newHead;
}
};
main(){
Solution ob;
vector<int> v = {1,2,3,4,5,6,7,8,9};
ListNode *head = make_list(v);
print_list(ob.rotateRight(head, 4));
} 入力
[1,2,3,4,5,6,7,8,9] 4
出力
[6, 7, 8, 9, 1, 2, 3, 4, ]
-
C++の次の大きな要素
次に大きい要素は、その次の最初の大きい要素です。例を見てみましょう。 arr =[4、5、3、2、1] 4の次に大きい要素は5であり、要素3、2、1の次に大きい要素は-1です。これは、それらの後に大きい要素がないためです。 アルゴリズム 乱数で配列を初期化します。 スタックを初期化します。 スタックに最初の要素を追加します。 配列の要素を繰り返し処理します。 スタックが空の場合は、現在の要素をスタックに追加します。 現在の要素がスタックの最上位の要素よりも大きい間。 一番上の要素を、次に大きい要素を現在の要素として印刷します。 一番上の要素
-
C++でランダムポインタを使用してリストをコピーする
リンクリストは線形データ構造であり、各ノードには2つのブロックがあり、一方のブロックにはノードの値またはデータが含まれ、もう一方のブロックには次のフィールドのアドレスが含まれます。 各ノードにリスト内の他のノードを指すランダムポインタが含まれるようなリンクリストがあると仮定します。タスクは、元のリストと同じリストを作成することです。ランダムなポインタを持つ元のリストからリストをコピーすることを、リンクリストの「ディープコピー」と呼びます。 例 入力-1 出力: 5-> 2 -> 3 -> 7 ->4 -> 説明: この問題を解決するためのア