[解決済み] 2つのポインタを使って単一リンクリストを逆引きする方法
2022-09-07 02:45:34
質問
2つのポインタだけを使って単一リンクリストを反転させるロジックはないでしょうか。
以下は、3つのポインタを使った単一リンクリストの反転、すなわち
p
,
q
,
r
:
struct node {
int data;
struct node *link;
};
void reverse() {
struct node *p = first,
*q = NULL,
*r;
while (p != NULL) {
r = q;
q = p;
p = p->link;
q->link = r;
}
first = q;
}
リンクリストを逆引きするための他の代替手段はないのでしょうか? 時間の複雑さの観点から、単一リンクリストをリバースするための最良のロジックは何でしょうか?
どのように解決するのですか?
何か代替案がありますか? いいえ、これは限りなくシンプルであり、根本的に異なる方法はありません。 このアルゴリズムはすでに O(n) 時間であり、すべてのノードを変更する必要があるため、これ以上速くすることはできません。
あなたのコードは正しい方向に進んでいるように見えますが、上のような形では全く動作していません。 以下は動作するバージョンです。
#include <stdio.h>
typedef struct Node {
char data;
struct Node* next;
} Node;
void print_list(Node* root) {
while (root) {
printf("%c ", root->data);
root = root->next;
}
printf("\n");
}
Node* reverse(Node* root) {
Node* new_root = 0;
while (root) {
Node* next = root->next;
root->next = new_root;
new_root = root;
root = next;
}
return new_root;
}
int main() {
Node d = { 'd', 0 };
Node c = { 'c', &d };
Node b = { 'b', &c };
Node a = { 'a', &b };
Node* root = &a;
print_list(root);
root = reverse(root);
print_list(root);
return 0;
}
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み】リンクリストのループを検出する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C関数から文字列を返す
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] なぜ16進数には0xがつくのですか?