117.info
人生若只如初见

c语言单向链表逆序如何实现

在C语言中,要实现单向链表的逆序,我们需要改变链表中每个节点的next指针,使其指向前一个节点。以下是实现这一功能的步骤:

  1. 初始化三个指针:prev、curr和next。其中,prev用于保存当前节点的前一个节点,初始化为NULL;curr用于遍历链表,初始化为链表的头节点;next用于保存当前节点的下一个节点,初始化为NULL。
  2. 遍历链表,对于每个节点,先保存其下一个节点到next指针,然后将当前节点的next指针指向前一个节点prev。接着,将prev指针移动到curr指针,将curr指针移动到next指针。重复这个过程,直到curr指针变为NULL,即链表遍历完成。
  3. 在遍历过程中,需要注意更新链表的头节点。当curr指针变为NULL时,prev指针指向的是原链表的最后一个节点,即新链表的头节点。因此,需要将链表的头节点更新为prev指针。

以下是具体的C语言代码实现:

#include 
#include 

// 定义链表节点结构体
typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

// 创建新节点的函数
ListNode* createNode(int val) {
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 逆序链表的函数
void reverseList(ListNode** head) {
    ListNode* prev = NULL;
    ListNode* curr = *head;
    ListNode* next = NULL;

    while (curr != NULL) {
        // 保存当前节点的下一个节点
        next = curr->next;
        // 将当前节点的next指针指向前一个节点
        curr->next = prev;
        // 更新prev和curr指针
        prev = curr;
        curr = next;
    }

    // 更新链表的头节点
    *head = prev;
}

// 打印链表的函数
void printList(ListNode* head) {
    ListNode* curr = head;
    while (curr != NULL) {
        printf("%d -> ", curr->val);
        curr = curr->next;
    }
    printf("NULL\n");
}

int main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5 -> NULL
    ListNode* head = createNode(1);
    head->next = createNode(2);
    head->next->next = createNode(3);
    head->next->next->next = createNode(4);
    head->next->next->next->next = createNode(5);

    printf("原链表:\n");
    printList(head);

    // 逆序链表
    reverseList(&head);

    printf("逆序后的链表:\n");
    printList(head);

    return 0;
}

运行上述代码,输出结果为:

原链表:
1 -> 2 -> 3 -> 4 -> 5 -> NULL
逆序后的链表:
5 -> 4 -> 3 -> 2 -> 1 -> NULL

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

推荐文章

  • c语言goto用法是什么

    在C语言中,goto语句用于从一个位置跳转到另一个位置。它可以用于跳出循环、条件语句或者函数。goto语句的语法如下:
    goto label;
    ...
    label: //...

  • goto在c语言中的运用方法是什么

    goto 语句在 C 语言中允许程序从一个位置跳转到另一个位置。然而,在实际编程中,过度使用 goto 语句通常被认为是一种不好的编程实践,因为它可能导致代码结构混...

  • c语言堆和栈的区别是什么

    C语言中的堆和栈是两种不同的内存分配方式。 栈(Stack):栈是由编译器自动分配和释放的内存区域,用于存储局部变量和函数调用的上下文信息。栈的特点是先进后出...

  • C语言结构体数组怎么定义和使用

    在C语言中,可以通过定义结构体数组来存储多个具有相同数据类型的结构体对象。下面是定义和使用结构体数组的示例代码:
    #include // 定义一个结构体类型

  • c语言栈的创建方法是什么

    在C语言中,栈(stack)通常是由编译器自动管理的,它用于存储局部变量、函数调用时的参数以及返回地址等。栈的创建和管理是隐式的,程序员无需显式地创建或销毁...

  • c语言如何求三角形面积和周长

    在C语言中,可以使用以下公式来计算三角形的面积和周长: 周长:三角形的周长是其三条边长之和。如果已知三角形的三条边长a、b和c,则可以通过将它们相加来计算周...

  • c语言如何解二元二次方程

    在C语言中,可以使用以下方法来解二元二次方程组: 消元法:通过两个方程相减消去一个未知数,从而将二元二次方程组转化为一元二次方程,然后求解这个一元二次方...

  • Linux下MySQL数据库如何降低延迟

    在Linux下,有多种方法可以降低MySQL数据库的延迟 优化硬件配置: 提高CPU性能:选择更快的CPU,或者增加CPU核心数。
    增加内存:为MySQL分配更多的内存,以...