温馨提示×

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

小亿
84
2024-10-11 17:38:19
栏目: 编程语言

在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 <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
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

0