用c语言写 有一线性表的单链表表示为(a,a2,a3,••••a.)设计算法将单链表逆 置(an,an-l,an-2,•••a1)
时间: 2024-09-12 17:07:27 浏览: 44
在C语言中,实现单链表的逆转通常需要遍历链表,并在遍历过程中改变链表中各节点的指针方向。下面是一个简单的算法描述:
1. 初始化三个指针:`prev` 指向 `NULL`,用于记录当前节点的前一个节点;`current` 指向链表的头节点,表示当前处理的节点;`next` 用于暂存 `current` 的下一个节点,以防止链表断开。
2. 遍历链表,对于当前的 `current` 节点,先保存它的下一个节点到 `next`。
3. 将 `current` 的 `next` 指针指向前一个节点 `prev`。
4. 移动 `prev` 和 `current` 指针到下一节点,即 `prev` 移动到 `current`,`current` 移动到 `next`。
5. 重复步骤2到4,直到 `current` 为 `NULL`,这时 `prev` 指向的就是新的链表头。
6. 最后,更新原链表头指针指向 `prev`,完成链表的逆转。
下面是该算法的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 链表逆置函数
void reverseList(Node** head) {
Node* prev = NULL;
Node* current = *head;
Node* next = NULL;
while (current != NULL) {
next = current->next; // 保存下一个节点
current->next = prev; // 反转当前节点的指针
prev = current; // 移动prev到当前节点
current = next; // 移动current到下一个节点
}
*head = prev; // 更新头指针到新链表头
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 主函数
int main() {
Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
printf("Original List: ");
printList(head);
reverseList(&head);
printf("Reversed List: ");
printList(head);
return 0;
}
```
阅读全文