用C语言编写逆置带头结点的单链表L。
时间: 2024-09-22 15:05:47 浏览: 33
在C语言中,要逆置一个带头结点的单链表,你可以通过三个指针分别指向当前节点、前一个节点和下一个节点,然后逐步遍历整个列表,每次改变这三个节点的关系来实现。以下是一个简单的示例:
```c
// 定义链表结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 用于逆置链表的函数
ListNode* reverseList(ListNode* head) {
ListNode *prev = NULL; // 初始化前一个节点为空
ListNode *current = head; // 初始化当前节点为头节点
while (current != NULL) { // 遍历链表直到到达尾部
ListNode *nextTemp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前一个节点
prev = current; // 更新前一个节点为当前节点
current = nextTemp; // 更新当前节点为下一个节点
}
return prev; // 返回新的头节点,即原链表的尾节点
}
```
在这个函数中,我们不断更新`current`指向`nextTemp`,使得链表的方向朝相反方向变化。最后返回`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语言将带头结点的单链表l逆置
在 C 语言中,将一个带头节点的单链表逆转,即改变每个节点的前驱指向,可以通过迭代或递归的方式实现。这里提供一个使用迭代方法的例子:
首先,我们需要定义链表节点结构体:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
然后,编写一个函数来逆置链表:
```c
Node* reverseList(Node* head) {
Node *prev = NULL, *current = head, *next = NULL;
// 当链表非空时,循环进行
while (current != NULL) {
// 保存当前节点的下一个节点
next = current->next;
// 将当前节点的next指向前一个节点
current->next = prev;
// 更新前一个节点、当前节点
prev = current;
current = next;
}
// 返回新头节点,即原链表的尾部
return prev;
}
```
在这个函数里,我们使用了三个指针,`prev` 指向当前节点的前一个节点,`current` 初始指向头节点,`next` 存储当前节点的下一个节点。每一步,我们都更新 `current->next` 指向 `prev`,然后移动指针向前。
下面是完整代码的一个简单测试:
```c
int main() {
Node* head = createLinkedList(); // 创建一个链表
// ...(假设createLinkedList函数已定义)
Node* reversedHead = reverseList(head);
// 打印反转后的链表
printList(reversedHead); // 假设printList函数已定义
return 0;
}
```
阅读全文