试用C写一算法对单链表就地逆置
时间: 2024-09-12 13:03:47 浏览: 47
056 单链表就地逆置 C语言
5星 · 资源好评率100%
当然可以。在C语言中,你可以使用迭代的方式来实现单链表的就地逆置(也称为反转)。这种方法不需要额外的空间存储节点,直接通过修改现有节点的指针来达到反转的效果。下面是一个简单的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 就地逆置链表函数
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表为空或者只有一个元素,无需反转
}
Node *prev = NULL, *current = *head, *nextTemp;
while (current != NULL) {
// 保存当前节点的下一个节点
nextTemp = current->next;
// 更新当前节点的next指向前一个节点
current->next = prev;
// 移动前驱、当前和后继指针
prev = current;
current = nextTemp;
}
*head = prev; // 最后,原头节点变成了新的尾节点
}
// 测试代码
int main() {
// 创建示例链表
Node* list = (Node*)malloc(sizeof(Node));
list->data = 1;
list->next = (Node*)malloc(sizeof(Node));
list->next->data = 2;
list->next->next = (Node*)malloc(sizeof(Node));
list->next->next->data = 3;
list->next->next->next = NULL;
printf("Original List: ");
Node* temp = list;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
reverseList(&list); // 反转链表
printf("Reversed List: ");
temp = list;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
free(list);
return 0;
}
阅读全文