c语言编程 【问题描述】 给定一个带头结点的单链表,将单链表就地逆置。 【输入形式】 链表长度 链表(以空格区分) 【输出形式】 链表(以空格区分) 【样例输入】 3 1 2 3 【样例输出】 3 2 1
时间: 2024-02-06 11:04:06 浏览: 103
好的,可以使用C语言编写一个就地逆置单链表的程序,代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
Node *createList(int len);
void printList(Node *head);
void reverseList(Node *head);
int main()
{
int len;
printf("请输入链表的长度:");
scanf("%d", &len);
Node *head = createList(len);
printf("原链表:");
printList(head->next);
reverseList(head);
printf("逆置后的链表:");
printList(head->next);
return 0;
}
Node *createList(int len)
{
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
Node *tail = head;
int i, data;
for (i = 0; i < len; i++) {
scanf("%d", &data);
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
tail->next = node;
tail = node;
}
return head;
}
void printList(Node *head)
{
while (head) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
void reverseList(Node *head)
{
if (head == NULL || head->next == NULL) {
return;
}
Node *pre = head->next;
Node *cur = pre->next;
Node *next;
pre->next = NULL;
while (cur) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head->next = pre;
}
```
这个程序会先让用户输入链表的长度以及各个节点的值,然后创建一个带头结点的单链表,并输出原链表。接着调用`reverseList`函数对链表进行逆置,最后输出逆置后的链表。
`reverseList`函数使用了三个指针`pre`、`cur`、`next`,分别指向当前节点的前一个节点、当前节点和后一个节点,然后按照顺序遍历整个链表,将当前节点的`next`指针指向前一个节点,然后依次向后移动三个指针,直到遍历完整个链表。逆置完成后,需要将头结点的`next`指针指向链表的新头节点,即原链表的尾节点。
阅读全文