用具体的C语言代码表示出来 已知head指想一个带头结点的单向链表,链表的每个结点包含数据long和指向本结构结点的指针,编写函数实现逆置 head…a…b…c…d…null head…d…c…b…a…null
时间: 2023-09-24 10:05:30 浏览: 103
### 回答1:
以下是一个实现单向链表逆转的 C 语言代码:
```c
struct Node {
long data;
struct Node* next;
};
void reverseList(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;
}
*head = prev;
}
```
在这个代码中,我们创建了一个 `Node` 结构体来表示链表的结点。`reverseList` 函数接受一个指向链表头结点的指针作为参数,将链表原地逆置。
逆置链表的过程中,我们使用三个指针 `prev`、`current` 和 `next`。`prev` 指向当前结点的前一个结点(初始值为 `NULL`),`current` 指向当前结点,`next` 指向当前结点的下一个结点。我们在循环中不断地将 `current->next` 指向 `prev`,然后将三个指针向后移动。最后,我们将链表头指针指向新的头结点 `prev`。
### 回答2:
可以使用C语言代码实现链表的逆置,具体代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表的结点结构体
struct ListNode {
long data; // 数据域
struct ListNode* next; // 指针域
};
// 定义链表逆置函数
void reverseLinkedList(struct ListNode** head) {
struct ListNode* current = *head;
struct ListNode* prev = NULL;
while (current != NULL) {
struct ListNode* next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}
// 打印链表元素
void printLinkedList(struct ListNode* head) {
struct ListNode* current = head;
while (current != NULL) {
printf("%ld ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
// 创建链表的头结点
struct ListNode* head = malloc(sizeof(struct ListNode));
head->data = 0;
head->next = NULL;
// 添加节点a
struct ListNode* nodeA = malloc(sizeof(struct ListNode));
nodeA->data = 1;
nodeA->next = NULL;
head->next = nodeA;
// 添加节点b
struct ListNode* nodeB = malloc(sizeof(struct ListNode));
nodeB->data = 2;
nodeB->next = NULL;
nodeA->next = nodeB;
// 添加节点c
struct ListNode* nodeC = malloc(sizeof(struct ListNode));
nodeC->data = 3;
nodeC->next = NULL;
nodeB->next = nodeC;
// 添加节点d
struct ListNode* nodeD = malloc(sizeof(struct ListNode));
nodeD->data = 4;
nodeD->next = NULL;
nodeC->next = nodeD;
// 打印原链表
printf("原链表:");
printLinkedList(head->next);
// 逆置链表
reverseLinkedList(&(head->next));
// 打印逆置后的链表
printf("逆置后的链表:");
printLinkedList(head->next);
// 释放链表内存
struct ListNode* current = head->next;
while (current != NULL) {
struct ListNode* temp = current;
current = current->next;
free(temp);
}
free(head);
return 0;
}
```
运行结果:
```
原链表:1 2 3 4
逆置后的链表:4 3 2 1
```
以上示例代码中,我们首先定义了一个带头结点的单向链表,然后使用了 `reverseLinkedList` 函数实现链表的逆置。最后我们分别打印原链表和逆置后的链表,并释放链表的内存。
### 回答3:
要实现链表的逆置,可以使用迭代的方式进行操作。具体的C语言代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
long data;
struct Node* next;
} Node;
// 链表逆置函数
void reverseList(Node* head) {
if (head == NULL || head->next == NULL) {
return; // 空链表或只有一个结点时直接返回
}
Node* prev = NULL;
Node* curr = head->next;
Node* next = NULL;
while (curr != NULL) {
next = curr->next; // 保存当前结点的下一个结点
curr->next = prev; // 将当前结点指向前一个结点
prev = curr; // 更新前一个结点为当前结点
curr = next; // 更新当前结点为下一个结点
}
head->next = prev; // 将头结点指向新的第一个结点
}
// 链表打印函数(用于验证结果)
void printList(Node* head) {
Node* curr = head->next;
while (curr != NULL) {
printf("%ld ", curr->data);
curr = curr->next;
}
printf("\n");
}
int main() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 初始化链表为空
Node* node1 = (Node*)malloc(sizeof(Node));
Node* node2 = (Node*)malloc(sizeof(Node));
Node* node3 = (Node*)malloc(sizeof(Node));
Node* node4 = (Node*)malloc(sizeof(Node));
node1->data = 1; // 节点1的数据
node2->data = 2; // 节点2的数据
node3->data = 3; // 节点3的数据
node4->data = 4; // 节点4的数据
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
printf("原链表:");
printList(head);
printf("逆置后的链表:");
reverseList(head);
printList(head);
// 释放所有结点的内存
free(node1); free(node2); free(node3); free(node4); free(head);
return 0;
}
```
运行以上代码输出结果为:
```
原链表:1 2 3 4
逆置后的链表:4 3 2 1
```
可见链表已经成功逆置。
阅读全文