首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中交换链表中的节点使我可以复制节点

在C语言中,要交换链表中的节点并复制节点,可以按照以下步骤进行操作:

  1. 首先,定义一个辅助指针变量temp,用于保存要交换的两个节点的地址。
  2. 遍历链表,找到需要交换的两个节点,并将它们的地址分别保存在temp中。
  3. 判断temp是否为空,如果为空则说明链表为空或者只有一个节点,无法进行交换操作,直接返回。
  4. 如果temp不为空,则进行节点交换操作。首先,将temp指向的第一个节点的next指针指向第二个节点的next指针所指向的节点,即将第一个节点与第二个节点断开连接。
  5. 然后,将temp指向的第二个节点的next指针指向第一个节点,即将第二个节点指向第一个节点。
  6. 最后,将链表的头指针指向temp指向的第二个节点,完成节点交换操作。

以下是一个示例代码:

代码语言:txt
复制
#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以及要交换的两个节点的值xy作为参数。在函数中,我们使用辅助指针变量tempprevXprevY来保存要交换的节点的地址。通过遍历链表,找到要交换的节点及其前一个节点。

接下来,我们判断要交换的节点是否存在,如果不存在则直接返回。如果存在,则进行节点交换操作。我们首先将第一个节点的next指针指向第二个节点的next指针所指向的节点,即将第一个节点与第二个节点断开连接。然后,将第二个节点的next指针指向第一个节点,即将第二个节点指向第一个节点。最后,将链表的头指针指向第二个节点,完成节点交换操作。

main函数中,我们创建了一个简单的链表,并调用swapNodes函数进行节点交换和复制操作。最后,我们打印交换后的链表。

这是一个简单的链表节点交换并复制的示例,可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券