将一个带头结点的单链表就地逆置C语言
时间: 2024-11-17 10:30:42 浏览: 24
在C语言中,将一个带头结点的单链表就地逆置可以使用迭代或递归的方法。这里提供一种常见的迭代方法:
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
void reverseList(ListNode** head) {
if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个节点
return;
}
ListNode* prev = NULL; // 创建前驱节点
ListNode* curr = *head; // 当前节点指向头节点
while (curr != NULL) { // 遍历整个链表
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点的next指向前一个节点
prev = curr; // 更新前驱节点
curr = nextTemp; // 移动到下一个节点
}
*head = prev; // 最后头节点变成原链表的尾部
}
```
这个函数接受链表的头节点地址作为输入,通过不断地交换节点的`next`指针,实现了链表的逆置。结束后,原始头节点变成了新链表的尾节点。
相关问题
用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 ListNode {
int data;
struct ListNode* next;
} ListNode;
// 初始化带头结点的单链表
ListNode* initList() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
return head;
}
// 尾插法建立单链表
void createList(ListNode* head) {
int data;
ListNode* tail = head;
printf("请输入链表中的元素(以-1结束):");
while (1) {
scanf("%d", &data);
if (data == -1) {
break;
}
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
}
// 打印带头结点的单链表
void printList(ListNode* head) {
ListNode* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 就地逆置带头结点的单链表
void reverseList(ListNode* head) {
ListNode* p = head->next;
ListNode* q = p->next;
p->next = NULL; // 将第一个结点的指针域赋值为NULL
while (q != NULL) {
ListNode* r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = p; // 将头结点的指针域指向原链表的最后一个结点
}
int main() {
ListNode* head = initList();
createList(head);
printf("原链表:");
printList(head);
reverseList(head);
printf("逆置后的链表:");
printList(head);
return 0;
}
```
运行结果:
```
请输入链表中的元素(以-1结束):1 2 3 4 5 -1
原链表:1 2 3 4 5
逆置后的链表:5 4 3 2 1
```
阅读全文