c语言就地逆置一条带头节点的单链表,头插法
时间: 2023-06-16 22:07:48 浏览: 57
假设链表的头节点为head,原链表为:head -> a -> b -> c -> d
1. 从头节点的下一个节点a开始,依次将每个节点插入到头节点head之后
2. 需要一个中间变量p来暂存当前节点的下一个节点,防止链表断裂
代码实现如下:
```c
void reverseList(Node *head) {
if (head == NULL || head->next == NULL) {
return;
}
Node *p = head->next; // p指向第一个要插入的节点a
head->next = NULL; // 将头节点的next指针置为空,防止链表断裂
while (p != NULL) {
Node *next = p->next; // 暂存下一个节点
p->next = head->next; // 将p节点插入到头节点之后
head->next = p;
p = next; // p指向下一个节点,继续插入操作
}
}
```
执行上述代码后,链表变为:head -> d -> c -> b -> a
相关问题
用c语言编写实现带头结点单链表就地逆置的成员函数
以下是一个用C语言编写的带头结点单链表就地逆置的成员函数:
```c
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; // 移动prev指针
curr = next; // 移动curr指针
}
head->next = prev; // 将头节点指向反转后的链表头
}
```
该函数首先判断链表是否为空或只有一个节点,如果是,则直接返回。接着,定义三个指针prev、curr和next,分别指向当前节点的前一个节点、当前节点和下一个节点。然后,从头节点的下一个节点开始遍历链表,将当前节点指向前一个节点,然后移动prev、curr和next指针。最后,将头节点指向反转后的链表头。
c语言,实现带头结点的单链表的就地逆置
好的,我可以回答这个问题。以下是C语言实现带头结点的单链表就地逆置的代码:
```C
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
void CreateList(LinkList *L, int n); // 创建带头结点的单链表
void ReverseList(LinkList *L); // 就地逆置带头结点的单链表
void PrintList(LinkList L); // 输出带头结点的单链表
int main() {
LinkList L;
int n;
printf("请输入单链表长度:");
scanf("%d", &n);
CreateList(&L, n);
printf("逆置前:");
PrintList(L);
ReverseList(&L);
printf("逆置后:");
PrintList(L);
return 0;
}
void CreateList(LinkList *L, int n) {
Node *p, *q;
int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
q = *L;
for (i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
printf("请输入第%d个节点的值:", i + 1);
scanf("%d", &(p->data));
p->next = NULL;
q->next = p;
q = p;
}
}
void ReverseList(LinkList *L) {
Node *p, *q;
if (*L == NULL || (*L)->next == NULL) {
return;
}
p = (*L)->next;
(*L)->next = NULL;
while (p != NULL) {
q = p->next;
p->next = (*L)->next;
(*L)->next = p;
p = q;
}
}
void PrintList(LinkList L) {
Node *p;
p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```