在C语言中,要交换链表中的节点并复制节点,可以按照以下步骤进行操作:
以下是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct Node {
int data;
struct Node* next;
};
// 交换链表中的节点并复制节点
void swapNodes(struct Node** head, int x, int y) {
// 如果x和y相同,无需交换
if (x == y) {
return;
}
// 定义辅助指针变量temp和prevX、prevY用于保存要交换的节点的前一个节点
struct Node *temp = NULL, *prevX = NULL, *prevY = NULL;
struct Node* current = *head;
// 遍历链表,找到要交换的节点及其前一个节点
while (current != NULL) {
if (current->data == x) {
prevX = current;
temp = prevX->next;
}
if (current->data == y) {
prevY = current;
temp = prevY->next;
}
current = current->next;
}
// 如果要交换的节点中有一个节点不存在,直接返回
if (prevX == NULL || prevY == NULL) {
return;
}
// 如果要交换的节点中有一个节点是头节点,更新头指针
if (prevX == *head) {
*head = prevY;
} else if (prevY == *head) {
*head = prevX;
}
// 交换节点
struct Node* tempNext = prevX->next;
prevX->next = prevY->next;
prevY->next = tempNext;
}
// 打印链表
void printList(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
// 创建链表
void push(struct Node** head, int newData) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = newData;
newNode->next = *head;
*head = newNode;
}
int main() {
struct Node* head = NULL;
// 创建链表
push(&head, 4);
push(&head, 3);
push(&head, 2);
push(&head, 1);
printf("原始链表:");
printList(head);
// 交换节点并复制节点
swapNodes(&head, 2, 3);
printf("交换后的链表:");
printList(head);
return 0;
}
这段代码中,我们首先定义了一个链表节点结构体struct Node
,包含一个整型数据data
和一个指向下一个节点的指针next
。
然后,我们定义了swapNodes
函数,该函数接受链表的头指针head
以及要交换的两个节点的值x
和y
作为参数。在函数中,我们使用辅助指针变量temp
和prevX
、prevY
来保存要交换的节点的地址。通过遍历链表,找到要交换的节点及其前一个节点。
接下来,我们判断要交换的节点是否存在,如果不存在则直接返回。如果存在,则进行节点交换操作。我们首先将第一个节点的next
指针指向第二个节点的next
指针所指向的节点,即将第一个节点与第二个节点断开连接。然后,将第二个节点的next
指针指向第一个节点,即将第二个节点指向第一个节点。最后,将链表的头指针指向第二个节点,完成节点交换操作。
在main
函数中,我们创建了一个简单的链表,并调用swapNodes
函数进行节点交换和复制操作。最后,我们打印交换后的链表。
这是一个简单的链表节点交换并复制的示例,可以根据实际需求进行修改和扩展。
领取专属 10元无门槛券
手把手带您无忧上云