编程实现对一个单向链表的结点进行反转,也就是将链表结点按逆序排列,排序后链头将成为链尾,而链尾将成为链头。自定义函数名称及函数功能要求如下: (1)定义“createNode”函数,实现创建一个新结点。 (2)定义“createList”函数,实现一个单向链表的创建。 ● 在创建结点时通过键盘输入为每个结点的数据成员value进行赋值。 ● 使用“头插法”将每个结点逐一插入到链表中。 (3)定义“display”的函数,实现对链表所有结点的遍历输出。 (4)定义“reverse”的函数,实现对链表结点的反转。 目前,已经编辑完成“createNode”函数、“createList”函数和“main”函数,请编程实现“display”函数和“reverse”函数。
时间: 2023-11-22 07:55:05 浏览: 47
下面是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点结构体
typedef struct ListNode {
int value;
struct ListNode* next;
} ListNode;
// 创建新结点
ListNode* createNode() {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->next = NULL;
printf("请输入结点的值:");
scanf("%d", &node->value);
return node;
}
// 创建链表
ListNode* createList() {
ListNode* head = NULL;
ListNode* tail = NULL;
int len = 0;
printf("请输入链表结点个数:");
scanf("%d", &len);
for (int i = 0; i < len; i++) {
ListNode* node = createNode();
if (head == NULL) {
head = node;
tail = node;
} else {
node->next = head;
head = node;
}
}
return head;
}
// 遍历输出链表
void display(ListNode* head) {
ListNode* p = head;
while (p != NULL) {
printf("%d ", p->value);
p = p->next;
}
printf("\n");
}
// 反转链表
ListNode* reverse(ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* prev = NULL;
ListNode* cur = head;
while (cur != NULL) {
ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
int main() {
ListNode* head = createList();
printf("原始链表:");
display(head);
head = reverse(head);
printf("反转后的链表:");
display(head);
return 0;
}
```
编写程序时需要注意以下几点:
- 创建链表时使用头插法,因为头插法的时间复杂度是 O(1)。
- 在遍历链表时,一定要判断当前结点是否为空,否则会产生段错误。
- 在反转链表时,需要设置三个指针,分别为 prev、cur、next。prev 表示反转后的链表头部,cur 表示当前处理的结点,next 表示 cur 的下一个结点。
阅读全文