📅  最后修改于: 2023-12-03 14:58:06.597000             🧑  作者: Mango
在编写算法时,将链表视为一个基本数据结构是常见的。这个数据结构可以非常有用,可以用来存储各种类型的数据,并且可以方便地进行操作,例如在其中交换元素。
本文将介绍一种通过更改链接对给定链表的元素进行成对交换的 C 程序。
以下是实现该算法的 C 语言代码:
#include <stdio.h>
#include <stdlib.h>
// 自定义链表结构体
struct node {
int data;
struct node *next;
};
// 将每两个相邻节点的位置交换
void swapAdjacentNodes(struct node *head) {
if (head == NULL || head->next == NULL) {
return;
}
struct node *temp = head;
head = head->next;
while (temp != NULL && temp->next != NULL) {
struct node *current = temp->next;
temp->next = current->next;
current->next = temp;
if (temp->next != NULL && temp->next->next != NULL) {
current->next->next = temp->next->next;
}
temp = temp->next;
}
}
// 创建链表
struct node *createList() {
struct node *head = NULL;
struct node *current = NULL;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int data;
scanf("%d", &data);
struct node *temp = (struct node *)malloc(sizeof(struct node));
temp->data = data;
temp->next = NULL;
if (head == NULL) {
head = temp;
current = temp;
} else {
current->next = temp;
current = current->next;
}
}
return head;
}
// 打印链表
void printList(struct node *head) {
struct node *temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 主方法
int main() {
struct node *head = createList();
printf("原始链表: ");
printList(head);
swapAdjacentNodes(head);
printf("交换后的链表: ");
printList(head);
return 0;
}
该程序的主要步骤是交换链表中的每两个相邻的节点。这是通过更改节点之间的链接来实现的。
首先,检查链表是否为空或者是否只有一个节点。如果是这些情况,直接返回。
接下来,我们重置 head
指向链表的第二个节点。然后,我们遍历链表并交换每个相邻的节点。要交换两个相邻的节点,我们需要更改它们之间的链接。具体来说,我们需要将 temp
指向当前节点,将 current
指向下一个节点,将 temp
的下一个节点设置为 current
的下一个节点,将 current
的下一个节点设置为 temp
,将 current
的下下个节点(如果存在)设置为 temp
的下一个节点。
通过更改链接对给定链表的元素进行成对交换可能是非常有用的,特别是当需要在链表中移动元素时。在示例代码中,我们展示了如何使用 C 语言实现这个算法,它可以应用于链表中的任何元素类型。