阅读量:0
在C语言中,要实现单向链表的逆序,我们需要改变链表中每个节点的next指针,使其指向前一个节点。以下是实现这一功能的步骤:
- 初始化三个指针:prev、curr和next。其中,prev用于保存当前节点的前一个节点,初始化为NULL;curr用于遍历链表,初始化为链表的头节点;next用于保存当前节点的下一个节点,初始化为NULL。
- 遍历链表,对于每个节点,先保存其下一个节点到next指针,然后将当前节点的next指针指向前一个节点prev。接着,将prev指针移动到curr指针,将curr指针移动到next指针。重复这个过程,直到curr指针变为NULL,即链表遍历完成。
- 在遍历过程中,需要注意更新链表的头节点。当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