117.info
人生若只如初见

c语言单向链表怎么反转

要反转一个单向链表,可以使用三个指针分别指向当前节点、前一个节点和后一个节点。然后,通过修改指针的指向来实现链表的反转。

具体步骤如下:

  1. 初始化三个指针:当前节点指针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
#include

// 定义链表节点结构体
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 = https://www.yisu.com/ask/1;>next = second;

    second->data = https://www.yisu.com/ask/2;>next = third;

    third->data = https://www.yisu.com/ask/3;>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 

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe418AzsLAQ9XBVI.html

推荐文章

  • c语言怎么获取字符串的每个字符

    在C语言中,可以通过使用数组的方式来获取字符串的每个字符。每个字符都可以通过索引来访问,索引从0开始。
    以下是一个示例代码,演示如何获取字符串的每个...

  • c语言怎么定义二维数组

    在C语言中,可以使用以下语法来定义二维数组:
    数据类型 数组名[行数][列数]; 其中,数据类型表示数组中每个元素的数据类型,数组名是标识符用于引用该数组...

  • c语言怎么读取一串字符

    在C语言中,可以使用scanf函数来读取一串字符。scanf函数需要使用格式控制符%s来读取字符串,格式如下:
    scanf("%s", 字符数组名); 以下是一个示例代码,演...

  • c语言主函数如何调用其他函数

    C语言的主函数通常使用函数调用来调用其他函数。函数调用的一般语法为:
    函数名(参数列表); 其中,函数名是要调用的函数的名称,参数列表是要传递给函数的参...

  • java中awt和swing的区别是什么

    AWT(Abstract Window Toolkit)是Java的最早的图形用户界面(GUI)工具包,它提供了一组用于创建和管理用户界面组件的类和方法。AWT是基于本地操作系统的窗口系...

  • Go语言中怎么实现锁机制

    在Go语言中,可以使用sync包中的Mutex类型来实现锁机制。Mutex是互斥锁,可以用来保护临界区,防止多个goroutine同时访问共享资源。
    下面是一个使用Mutex实...

  • c语言如何改变数组的值

    要改变数组的值,可以通过数组的索引来访问和修改数组元素。
    例如,给定一个int类型的数组arr,我们可以使用下标来修改数组的值:
    int arr[5] = {1, 2...

  • Java怎么反转双向链表

    要反转一个双向链表,可以按照以下步骤进行操作: 创建一个临时变量temp,用于保存当前节点的下一个节点。
    将当前节点的下一个节点指向前一个节点,将当前节...