用C语言实现双链表反转
时间: 2023-05-30 12:05:10 浏览: 137
以下是C语言实现双链表反转的代码:
```
#include <stdio.h>
#include <stdlib.h>
// 双链表节点结构体
typedef struct ListNode {
int val;
struct ListNode* next;
struct ListNode* prev;
} ListNode;
// 反转双链表函数
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* curr = head;
while (curr != NULL) {
ListNode* next = curr->next;
curr->next = prev;
curr->prev = next;
prev = curr;
curr = next;
}
return prev;
}
// 打印双链表函数
void printList(ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
// 创建双链表
ListNode* node1 = (ListNode*)malloc(sizeof(ListNode));
node1->val = 1;
ListNode* node2 = (ListNode*)malloc(sizeof(ListNode));
node2->val = 2;
ListNode* node3 = (ListNode*)malloc(sizeof(ListNode));
node3->val = 3;
ListNode* node4 = (ListNode*)malloc(sizeof(ListNode));
node4->val = 4;
node1->next = node2;
node2->prev = node1;
node2->next = node3;
node3->prev = node2;
node3->next = node4;
node4->prev = node3;
node4->next = NULL;
// 打印原始双链表
printf("Original List: ");
printList(node1);
// 反转双链表
ListNode* newHead = reverseList(node1);
// 打印反转后的双链表
printf("Reversed List: ");
printList(newHead);
return 0;
}
```
代码解析:
1. 定义了一个双链表节点结构体,包括节点值、下一个节点指针和上一个节点指针。
2. 定义了一个反转双链表的函数,参数为头节点指针,返回值为反转后的头节点指针。
3. 在反转双链表函数中,定义了三个指针变量,分别代表前一个节点、当前节点和下一个节点。初始时,前一个节点为NULL,当前节点为头节点。
4. 使用while循环遍历整个双链表,每次迭代时,先将当前节点的下一个节点保存到next指针中,然后将当前节点的next指针指向前一个节点,将prev指针指向next节点,更新前一个节点为当前节点,当前节点为next节点。
5. 最后返回前一个节点,即为反转后的头节点。
6. 定义了一个打印双链表的函数,参数为头节点指针,直接遍历整个链表,打印每个节点的值。
7. 在main函数中,创建了一个包含4个节点的双链表,并打印原始链表。
8. 调用反转双链表函数,得到反转后的链表头节点指针,并打印反转后的链表。
阅读全文