C言語で単方向連結リストを反転する方法は?
C言語における単方向連結リストの反転は、ポインタの参照を変更することで実現できます。具体的方法は以下の通りです。
- prev、curr、nextの3つのポインタを定義します。最初、prevはNULLを指し、currはリストの先頭のノードを指し、nextはcurrの次のノードを指します。
- リストをcurrがNULLを指すまで走査して、その中で以下の操作を繰り返す。
a. currの次のノードを指すようにnextを移動させ、リストの接続関係を維持する。
b. currのnextポインタをprevに向けることで、currのポインタの方向を逆にする。
c. prevをcurrに向けることで、反転したリストのヘッドノードを保持する。
d. currをnextに向けることで、リストの走査を続ける。 - 反転処理終了後、prevは反転後先頭ノードを指し、反転は完了します。
サンプルコードを以下に示します。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
while (curr != NULL) {
struct ListNode *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
int main() {
// 创建链表 1->2->3->4->5
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node5 = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = 1;
head->next = node2;
node2->val = 2;
node2->next = node3;
node3->val = 3;
node3->next = node4;
node4->val = 4;
node4->next = node5;
node5->val = 5;
node5->next = NULL;
// 反转链表
struct ListNode *newHead = reverseList(head);
// 遍历打印反转后的链表
struct ListNode *current = newHead;
while (current != NULL) {
printf("%d ", current->val);
current = current->next;
}
return 0;
}
上記のコードを実行すると、出力結果は次のようになります。5 4 3 2 1。つまり、リンクリストの反転に成功しています。