无忧资源站

 找回密码
 加入我们
查看: 2217|回复: 0

[C/C++] C++交换两个链表中的节点

[复制链接]

17

主题

30

帖子

197

积分

学徒

Rank: 2

积分
197
发表于 2023-6-19 00:21:35 | 显示全部楼层 |阅读模式
  1. C++编程交换两个链表中的节点

  2. ```cpp
  3. #include <iostream>

  4. using namespace std;

  5. // 定义链表节点结构体
  6. struct ListNode {
  7.     int val;
  8.     ListNode* next;
  9.     ListNode(int x) : val(x), next(NULL) {}
  10. };

  11. // 交换两个链表中的节点
  12. void swapNodes(ListNode** head, int x, int y) {
  13.     // 如果x和y相同,无需交换
  14.     if (x == y) {
  15.         return;
  16.     }

  17.     // 定义两个指针,用于记录需要交换的节点和它们的前一个节点
  18.     ListNode* prevX = NULL;
  19.     ListNode* currX = *head;
  20.     ListNode* prevY = NULL;
  21.     ListNode* currY = *head;

  22.     // 找到需要交换的节点和它们的前一个节点
  23.     while (currX && currX->val != x) {
  24.         prevX = currX;
  25.         currX = currX->next;
  26.     }

  27.     while (currY && currY->val != y) {
  28.         prevY = currY;
  29.         currY = currY->next;
  30.     }

  31.     // 如果x或y不在链表中,直接返回
  32.     if (!currX || !currY) {
  33.         return;
  34.     }

  35.     // 如果x是头节点,则更新头指针
  36.     if (prevX == NULL) {
  37.         *head = currY;
  38.     } else {
  39.         prevX->next = currY;
  40.     }

  41.     // 如果y是头节点,则更新头指针
  42.     if (prevY == NULL) {
  43.         *head = currX;
  44.     } else {
  45.         prevY->next = currX;
  46.     }

  47.     // 交换节点的next指针
  48.     ListNode* temp = currX->next;
  49.     currX->next = currY->next;
  50.     currY->next = temp;
  51. }

  52. // 打印链表
  53. void printList(ListNode* node) {
  54.     while (node) {
  55.         cout << node->val << " ";
  56.         node = node->next;
  57.     }
  58.     cout << endl;
  59. }

  60. int main() {
  61.     // 创建链表1: 1->2->3->4->5
  62.     ListNode* head1 = new ListNode(1);
  63.     head1->next = new ListNode(2);
  64.     head1->next->next = new ListNode(3);
  65.     head1->next->next->next = new ListNode(4);
  66.     head1->next->next->next->next = new ListNode(5);

  67.     // 创建链表2: 6->7->8->9->10
  68.     ListNode* head2 = new ListNode(6);
  69.     head2->next = new ListNode(7);
  70.     head2->next->next = new ListNode(8);
  71.     head2->next->next->next = new ListNode(9);
  72.     head2->next->next->next->next = new ListNode(10);

  73.     cout << "交换前的链表1: ";
  74.     printList(head1);
  75.     cout << "交换前的链表2: ";
  76.     printList(head2);

  77.     // 交换链表1中的节点2和节点4
  78.     swapNodes(&head1, 2, 4);

  79.     // 交换链表2中的节点7和节点9
  80.     swapNodes(&head2, 7, 9);

  81.     cout << "交换后的链表1: ";
  82.     printList(head1);
  83.     cout << "交换后的链表2: ";
  84.     printList(head2);

  85.     return 0;
  86. }
  87. ```

  88. 我们首先定义了一个链表节点的结构体`ListNode`,包含一个整数值`val`和一个指向下一个节点的指针`next`。

  89. 然后,我们定义了一个`swapNodes`函数,用于交换两个链表中的节点。该函数接受一个指向头节点指针的指针`head`,以及两个需要交换的节点的值`x`和`y`。函数首先判断`x`和`y`是否相同,如果相同则无需交换。然后,定义了四个指针`prevX`、`currX`、`prevY`和`currY`,分别指向需要交换的节点和它们的前一个节点。通过遍历链表找到这两个节点。如果找不到其中一个节点,则直接返回。接着,更新头指针和交换节点的`next`指针,完成节点交换。

  90. 最后,在`main`函数中,我们创建了两个链表,并调用`swapNodes`函数交换链表中的节点。然后,打印交换前后的链表。
复制代码


QQ|SiteMap|Map|小黑屋|无忧资源站

GMT+8, 2024-5-19 16:31 , Processed in 0.076084 second(s), 19 queries .

无忧资源站

Copyright © 2022-2032 www.wyzyz.net

快速回复 返回顶部 返回列表