📌  相关文章
📜  给定链表的成对交换元素的 C 程序(1)

📅  最后修改于: 2023-12-03 14:56:55.389000             🧑  作者: Mango

给定链表的成对交换元素的 C 程序

这是一个用 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 的值,继续交换下一对相邻节点,直到所有的相邻节点都被交换完毕。

该程序支持任意长度的链表,并能正确地处理链表为空或只有一个节点的情况。