C言語で単方向リストを逆にする方法は何ですか?

要逆転させるには、現在のノード、前のノード、後のノードをそれぞれ指す3つのポインタを使用します。そして、ポインタの指す先を変更することでリストの逆転を実現します。

具体な手順は次のとおりです:

  1. 3つのポインタを初期化します:現在のノードのポインタcurはリストの先頭ノードを指し、前のノードのポインタprevはNULLであり、次のノードのポインタnextもNULLである。
  2. 現在のノードのポインタcurがNULLになるまで、リストを走査する。
  3. 遍历中に、次のノードのポインタnextを、現在のノードcurの次のノードに指すようにする。
  4. 現在のノードのポインタcurの次のノードを前のノードprevに向ける。
  5. その後、前のノードのポインタprevを現在のノードのポインタcurに向けます。
  6. 最後、現在のノードのポインターcurを次のノードのポインターnextに指す。
  7. リスト全体を走査するまで、ステップ2から6を繰り返します。
  8. 最後に、リストのヘッド・ノードのポインタを前のノードのポインタであるprevに向けると、リストが逆転します。

以下はサンプルコードの実装例です:

#include<stdio.h>
#include<stdlib.h>

// 定义链表节点结构体
struct Node {
    int data;
    struct Node* next;
};

// 反转链表函数
struct Node* reverseLinkedList(struct Node* head) {
    struct Node* cur = head;
    struct Node* prev = NULL;
    struct Node* next = NULL;

    while (cur != NULL) {
        next = cur->next; // 暂存当前节点的下一个节点
        cur->next = prev; // 将当前节点的下一个节点指向前一个节点,实现翻转
        prev = cur; // 前一个节点指针后移
        cur = next; // 当前节点指针后移
    }

    head = prev; // 将链表头节点指向翻转后的链表的头节点

    return head;
}

// 打印链表函数
void printLinkedList(struct Node* head) {
    struct Node* cur = head;

    while (cur != NULL) {
        printf("%d ", cur->data);
        cur = cur->next;
    }

    printf("\n");
}

int main() {
    // 创建链表
    struct Node* head = (struct Node*)malloc(sizeof(struct Node));
    struct Node* second = (struct Node*)malloc(sizeof(struct Node));
    struct Node* third = (struct Node*)malloc(sizeof(struct Node));

    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = NULL;

    printf("原始链表:");
    printLinkedList(head);

    // 反转链表
    head = reverseLinkedList(head);

    printf("反转后的链表:");
    printLinkedList(head);

    // 释放内存
    free(head);
    free(second);
    free(third);

    return 0;
}

上記のコードは、3つのノードを含むリンクリストを作成し、reverseLinkedList関数を呼び出してリストを反転し、printLinkedList関数を使用して結果を印刷します。最後に動的に割り当てられたメモリを解放します。

結果は以下の通りです:

原始链表:1 2 3 
反转后的链表:3 2 1 
bannerAds