C语言把单向链表中元素逆置(不允许申请新的结点空间),要求输出原单链表内容和逆置后单链表内容。
时间: 2024-09-25 18:19:30 浏览: 48
在C语言中,如果要在单向链表中实现元素逆置而不允许分配额外的空间,可以采用“迭代”的方法,通过三个指针,分别指向当前节点、前一个节点和后一个节点,然后依次更新它们的位置。这里是一个基本的算法描述:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct Node {
int data;
struct Node* next;
} Node;
// 原始链表节点
Node* list[4] = {&node1, &node2, &node3, NULL}; // 假设有三个节点
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 如果链表只有一个元素或者空,直接返回
}
Node* prev = NULL;
Node* current = *head;
Node* next = NULL;
while (current != NULL) {
// 存储当前节点的下一个节点
next = current->next;
// 将当前节点指向prev节点
current->next = prev;
// 更新prev和current
prev = current;
current = next;
}
// 设置新头为原尾部
*head = prev;
}
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 先打印原始链表
printList(list);
// 逆置链表
reverseList(&list[0]);
// 再次打印逆置后的链表
printList(list);
return 0;
}
```
注意:这里的`list`是一个静态数组模拟了单向链表,实际项目中链表通常不会存储在一个数组里,而是动态分配和释放内存。
执行上述代码后,你会看到原始链表和逆置后链表的内容。因为没有新的节点空间,所以原来的节点位置发生了改变。
阅读全文