C言語で単方向連結リストを反転する方法は?

C言語における単方向連結リストの反転は、ポインタの参照を変更することで実現できます。具体的方法は以下の通りです。

  1. prev、curr、nextの3つのポインタを定義します。最初、prevはNULLを指し、currはリストの先頭のノードを指し、nextはcurrの次のノードを指します。
  2. リストをcurrがNULLを指すまで走査して、その中で以下の操作を繰り返す。
    a. currの次のノードを指すようにnextを移動させ、リストの接続関係を維持する。
    b. currのnextポインタをprevに向けることで、currのポインタの方向を逆にする。
    c. prevをcurrに向けることで、反転したリストのヘッドノードを保持する。
    d. currをnextに向けることで、リストの走査を続ける。
  3. 反転処理終了後、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。つまり、リンクリストの反転に成功しています。

bannerAds