用C语言给定一个带头结点的单链表,将单链表就地逆置。
时间: 2024-05-05 09:20:25 浏览: 150
好的,可以通过修改指针来将单链表就地逆置,具体的实现方法如下:
```
void reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head->next;
head->next = nullptr;
while (curr != nullptr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
head->next = prev;
}
```
其中,prev 表示已经反转的部分的头结点,curr 表示将要被反转的部分的头结点,利用 while 循环遍历整个链表,同时用 prev、curr、next 指针来完成以 curr 为头结点的部分的反转操作。最后,将头结点的 next 指向反转后链表的头结点 prev 即可。
相关问题
用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
```
用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指针。最后,将头节点指向反转后的链表头。
阅读全文