用c语言设计算法实现将单链表中的数据逆置的操作。
时间: 2024-09-15 16:10:11 浏览: 73
用C语言实现单链表的各种操作(一)
在C语言中,将单链表逆置的操作需要修改链表中节点的指向,使得链表的方向从正序变为倒序。这通常通过三个指针来完成,分别指向当前节点、前一个节点和下一个节点。在逆置的过程中,逐个节点地改变其指向,最终实现整个链表的逆置。下面是一个实现单链表逆置的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
// 创建链表节点
ListNode* createNode(int data) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
if (!newNode) {
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 向链表尾部添加节点
void appendNode(ListNode** head, int data) {
ListNode* newNode = createNode(data);
if (!newNode) {
return;
}
if (*head == NULL) {
*head = newNode;
} else {
ListNode* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
// 逆置链表
void reverseList(ListNode** head) {
ListNode* prev = NULL;
ListNode* current = *head;
ListNode* next = NULL;
while (current != NULL) {
next = current->next; // 保存下一个节点
current->next = prev; // 当前节点指向前一个节点,实现逆置
prev = current; // 前一个节点后移
current = next; // 当前节点后移
}
*head = prev; // 更新头指针为新的头节点
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 主函数
int main() {
ListNode* head = NULL;
appendNode(&head, 1);
appendNode(&head, 2);
appendNode(&head, 3);
appendNode(&head, 4);
appendNode(&head, 5);
printf("Original list: ");
printList(head);
reverseList(&head);
printf("Reversed list: ");
printList(head);
// 释放链表内存
ListNode* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
这段代码首先定义了一个链表节点的结构体,并提供了创建节点、添加节点到链表尾部、逆置链表、打印链表和释放链表内存的函数。`main`函数中创建了一个单链表,并展示逆置前后的链表内容。
阅读全文