用C语言写一个算法实现单链表的就地逆置 要求在原链表上进行
时间: 2023-12-29 10:11:05 浏览: 106
写一个算法将一单链表逆置。要求操作在原链表上进行。
好的,以下是用 C 语言实现单链表就地逆置的算法:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *create_list(int n) {
Node *head = NULL;
Node *tail = NULL;
for (int i = 1; i <= n; ++i) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
if (head == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
void print_list(Node *head) {
Node *p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void reverse_list(Node **head) {
Node *p = *head;
Node *q = NULL;
Node *r = NULL;
while (p != NULL) {
r = q;
q = p;
p = p->next;
q->next = r;
}
*head = q;
}
int main() {
Node *head = create_list(5);
printf("Original list: ");
print_list(head);
reverse_list(&head);
printf("Reversed list: ");
print_list(head);
return 0;
}
```
在这个算法中,我们定义了一个 `Node` 结构体,每个节点包含一个整数值和一个指向下一个节点的指针。我们使用 `create_list` 函数创建一个包含 `n` 个元素的单链表,并返回链表的头节点。`print_list` 函数用于打印链表中的所有元素。
重点是 `reverse_list` 函数,它使用三个指针 `p`、`q` 和 `r` 来逆置链表。其中,`p` 指向当前节点,`q` 指向上一个节点,`r` 则指向上一个节点的前一个节点。在每一次循环中,我们将 `q` 指向 `p`,然后将 `p` 指向下一个节点,最后将 `q` 的 `next` 指向 `r`。当循环结束时,`q` 就指向了原链表的最后一个节点,也就是逆置后的链表的头节点。最后,我们将原来的头节点指向逆置后的头节点即可。
在 `main` 函数中,我们创建一个包含五个元素的单链表,并打印出原来的链表。然后,我们调用 `reverse_list` 函数逆置链表,并打印出逆置后的链表。
注意,我们传递 `head` 的指针的指针给 `reverse_list` 函数,这是因为需要修改 `head` 的值,而单纯的传递指针是不够的。这种技巧在 C 语言中经常用于修改指针的值。
阅读全文