📌  相关文章
📜  通过更改链接对给定链接列表的元素进行成对交换的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:28:26.540000             🧑  作者: Mango

通过更改链接对给定链接列表的元素进行成对交换的 C++ 程序

在对数据结构进行操作的过程中,元素的交换一直是一个经典问题。通过更改链表链接对给定链表列表的元素进行成对交换是其中的一个常见问题。

在这个问题中,给定一个链表,需要通过修改链接,将链表中的元素成对交换。如果链表中的元素数量是奇数,则最后一个元素应该保持不变。例如,如果链表为 1->2->3->4,则交换后的结果应该为 2->1->4->3。

下面是一个用 C++ 编写的程序,用于实现此问题:

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        ListNode* prev = newHead;
        while (head != NULL && head->next != NULL) {
            ListNode* first = head;
            ListNode* second = head->next;
            prev->next = second;
            first->next = second->next;
            second->next = first;
            prev = first;
            head = first->next;
        }
        return newHead->next;
    }
};

int main() {
    ListNode* head = new ListNode(1);
    head->next = new ListNode(2);
    head->next->next = new ListNode(3);
    head->next->next->next = new ListNode(4);
    
    Solution solution;
    ListNode* swappedList = solution.swapPairs(head);
    
    while (swappedList != NULL) {
        cout << swappedList->val << " ";
        swappedList = swappedList->next;
    }
    
    cout << endl;

    return 0;
}

这个程序的基本思路是,首先在原始列表的前面添加一个虚拟头节点,然后使用 prev 指针指向它,将每对相邻节点的链接互换。需要注意的是,需要使用 first 和 second 指针保存交换的元素,同时需要更新 prev 和 head 指针,以便将它们正确地链接到新列表中。

最后,程序将返回新列表的头节点。

以上是本人用 C++ 编写的一份实现此问题的程序,如有错误或不足之处,欢迎指出。