使用C语言 设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的 存储空间
时间: 2023-08-31 17:41:44 浏览: 188
### 回答1:
下面是用C语言设计一个反转链表的算法:
```
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* reverseList(struct Node* head) {
struct Node *prev = NULL, *current = head, *next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
head = prev;
return head;
}
int main() {
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*) malloc(sizeof(struct Node));
second = (struct Node*) malloc(sizeof(struct Node));
third = (struct Node*) malloc(sizeof(struct Node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
printf("Original List:\n");
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
head = reverseList(head);
printf("\nReversed List:\n");
current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
return 0;
}
```
该算法的基本思路是遍历链表,将每个节点的链接方向逆转,并将逆转后的头结点返回。在遍历过程中,使用三个指针来分别指向前一个节点、当前节点和下一个节点,每次循环将当前节点的链接指向前一个节点,然后将三个指针向后移动一个节点,直到当前节点为NULL,即遍历到链表的末尾。最后将原链表的头节点指向逆转后的头节点即可。
### 回答2:
要设计一个算法,通过遍历一趟,将链表中所有节点的链接方向逆转,利用原表的存储空间。
首先,我们需要定义一个链表节点的结构。链表节点包含两个部分:数据部分和指针部分。数据部分存储节点的数据,指针部分用于指向下一个节点。
在C语言中,可以使用结构体来定义链表节点的结构。结构体的定义如下:
```
struct Node {
int data;
struct Node* next;
};
```
接下来,我们需要编写一个函数来实现逆转链表的功能。该函数的输入参数为链表的头节点指针。函数的返回值为逆转后的链表的头节点指针。
算法的思路如下:
1. 初始化三个指针:`prev`、`current`和`next`。
- `prev`指向前一个节点,初始值为NULL。
- `current`指向当前节点,初始值为头节点。
- `next`指向下一个节点,初始值为NULL。
2. 迭代遍历链表,直到`current`指向NULL。
- 在每一次迭代中,将`current`指向的节点的指针方向逆转,即将当前节点的指针指向前一个节点。
- 然后更新三个指针的位置:将`prev`指向`current`,`current`指向`next`,`next`指向`next`节点的下一个节点。
3. 返回逆转后的链表的头节点指针,即原链表的尾节点。
具体的代码实现如下:
```c
struct Node* reverseLinkedList(struct Node* head) {
struct Node* prev = NULL;
struct Node* current = head;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return prev;
}
```
这样,在使用C语言设计的算法中,通过遍历一趟,即可将链表中所有节点的链接方向逆转。
### 回答3:
要设计一个算法将链表中所有节点的链接方向逆转,但仍然利用原来的存储空间,我们可以使用头插法来实现。
首先,我们需要定义一个结构体表示链表的节点,包括数据域和指针域。假设我们的链表是单链表,而不是双向链表。
具体步骤如下:
1. 定义一个指针变量p指向链表的头节点。
2. 定义两个指针变量prev和cur,分别指向当前节点和前一个节点。
3. 初始化prev为NULL。
4. 进入循环,重复以下步骤:
- 将cur指向p所指向的节点。
- 将p指向下一个节点。
- 将cur的指针域指向prev,即将当前节点的指针指向前一个节点,实现链表方向的逆转。
- 更新prev为cur。
- 如果p为空,则退出循环。
5. 最后将链表的头节点指向prev,即将原来链表的头节点指向链表的尾节点。
以下是该算法的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void reverseList(Node** head) {
Node* prev = NULL;
Node* cur = *head;
while (cur != NULL) {
Node* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
*head = prev;
}
int main() {
// 创建链表
Node* head = (Node*)malloc(sizeof(Node));
head->data = 1;
Node* second = (Node*)malloc(sizeof(Node));
second->data = 2;
Node* third = (Node*)malloc(sizeof(Node));
third->data = 3;
head->next = second;
second->next = third;
third->next = NULL;
// 打印原链表
printf("原链表: ");
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
// 反转链表
reverseList(&head);
// 打印反转后的链表
printf("反转后的链表: ");
p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
// 释放链表的内存
Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
运行以上代码,输出结果为:
```
原链表: 1 2 3
反转后的链表: 3 2 1
```
这样,我们就成功地通过一趟遍历将链表中所有节点的链接方向逆转,同时仍然利用了原表的存储空间。
阅读全文