C语言 将一个带头结点的数据域依次为 a1,a2,…,an(n≥3)的单链表的所有结点逆置, 即第一个结点的数据域变为 an,…,最后一个结点的数据域为 a1。编程实现以上功能要求。
时间: 2024-03-16 21:43:23 浏览: 66
单链表的逆置(c语言)
以下是实现该功能的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结构体
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 创建单链表
ListNode* createList(int* arr, int n) {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
ListNode* tail = head;
for (int i = 0; i < n; i++) {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = arr[i];
node->next = NULL;
tail->next = node;
tail = node;
}
return head;
}
// 打印单链表
void printList(ListNode* head) {
ListNode* p = head->next;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
// 反转单链表
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* prev = NULL;
ListNode* curr = head->next;
while (curr != NULL) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head->next = prev;
return head;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(int);
ListNode* head = createList(arr, n);
printf("原始链表:");
printList(head);
printf("反转后链表:");
head = reverseList(head);
printList(head);
return 0;
}
```
该程序首先定义了单链表结构体,包含一个整数val和指向下一个节点的指针next。然后定义了createList函数用于创建单链表,printList函数用于打印单链表,reverseList函数用于反转单链表。最后在main函数中创建一个带头结点的单链表,打印原始链表,反转链表并打印反转后的链表。
阅读全文