📅  最后修改于: 2023-12-03 14:56:55.389000             🧑  作者: Mango
这是一个用 C 语言编写的程序,用于交换给定链表中每两个相邻元素的位置。
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct ListNode {
int val;
struct ListNode *next;
};
// 函数声明
struct ListNode* swapPairs(struct ListNode* head);
// 主函数
int main() {
// 创建一个示例链表
// 创建链表节点
struct ListNode *node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *node4 = (struct ListNode*)malloc(sizeof(struct ListNode));
// 设置节点值
node1->val = 1;
node2->val = 2;
node3->val = 3;
node4->val = 4;
// 构建链表
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
// 调用函数交换链表中的元素
struct ListNode* swappedList = swapPairs(node1);
// 输出交换后的链表
while (swappedList != NULL) {
printf("%d ", swappedList->val);
swappedList = swappedList->next;
}
printf("\n");
// 释放内存
free(node1);
free(node2);
free(node3);
free(node4);
return 0;
}
// 定义函数,用于链表元素的成对交换
struct ListNode* swapPairs(struct ListNode* head) {
// 如果链表为空或者只有一个节点,则无需交换
if (head == NULL || head->next == NULL) {
return head;
}
// 创建一个辅助节点
struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
dummy->next = head;
// 定义指针变量
struct ListNode *prev = dummy;
struct ListNode *cur = head;
// 交换相邻节点的位置
while (cur != NULL && cur->next != NULL) {
struct ListNode *nextNode = cur->next;
cur->next = nextNode->next;
nextNode->next = cur;
prev->next = nextNode;
prev = cur;
cur = cur->next;
}
// 释放辅助节点的内存
free(dummy);
return dummy->next;
}
该程序在交换链表中每两个相邻元素的位置时,使用了迭代的方法。首先创建一个辅助节点 dummy,指向链表的头结点,然后通过两个指针 prev 和 cur 分别指向相邻的节点,交换它们的位置。同时更新 prev 和 cur 的值,继续交换下一对相邻节点,直到所有的相邻节点都被交换完毕。
该程序支持任意长度的链表,并能正确地处理链表为空或只有一个节点的情况。