21xrx.com
2025-03-31 15:30:18 Monday
文章检索 我的文章 写文章
C++反转操作
2023-07-07 19:58:38 深夜i     9     0
C++ 反转 操作

C++反转操作是一个非常常见的编程技巧。这种技术可以用来反转任何类型的数据结构,例如数组,字符串,链表等等。在本文中,我们将探讨使用C++编写反转操作的原理和步骤。

首先,我们将从一个简单的数组开始。反转一个数组的步骤非常简单。我们可以使用两个指针,一个指向数组的开头,另一个指向数组的结尾。我们可以交换这两个指针指向的元素,并向中间移动指针,直到两个指针相遇。

下面是一个反转整数数组的示例代码:

#include <iostream>
using namespace std;
int main() {
 int arr[] = 4;
 int n = sizeof(arr)/sizeof(arr[0]);
 int i = 0, j = n-1;
 while (i < j) {
  int tmp = arr[i];
  arr[i] = arr[j];
  arr[j] = tmp;
  i++;
  j--;
 }
 for(int k = 0; k < n; k++) {
  cout << arr[k] << " ";
 }
 return 0;
}

以上代码首先将一个整数数组赋值给变量arr,然后将数组长度存储在变量n中。我们使用两个变量 i 和 j,分别指向数组的开头和结尾。接下来,我们在 while 循环中使用 tmp 变量来暂存 arr[i],接着交换 arr[i] 和 arr[j],将 tmp 赋值给 arr[j]。然后,我们向中间移动指针 i 和 j,直到它们相遇。最后,我们使用 for 循环显示反转后的数组。

现在,让我们来看看如何反转字符串。反转字符串的方法与反转数组的方法非常相似。我们仍然可以使用两个指针的方法,一个指向字符串的开头,另一个指向字符串的结尾。我们可以交换这两个指针指向的字符,并向中间移动指针,直到两个指针相遇。以下是反转字符串的示例代码:

#include <iostream>
#include <string>
using namespace std;
int main() {
 string str = "Hello World";
 int n = str.length();
 int i = 0, j = n - 1;
 while (i < j) {
  char tmp = str[i];
  str[i] = str[j];
  str[j] = tmp;
  i++;
  j--;
 }
 cout << str << endl;
 return 0;
}

以上代码首先将一个字符串赋值给变量 str,然后计算字符串长度,将其存储在变量 n 中。我们使用两个变量 i 和 j,分别指向字符串的开头和结尾。接下来,我们在 while 循环中使用 tmp 变量来暂存 str[i],接着交换 str[i] 和 str[j],将 tmp 赋值给 str[j]。然后,我们向中间移动指针 i 和 j,直到它们相遇。最后,我们使用 cout 显示反转后的字符串。

最后,让我们看看如何反转链表。我们可以使用迭代或递归方法来反转单向链表。迭代方法需要使用三个指针,分别指向当前节点,前一个节点和后一个节点。我们可以将当前节点的 next 指针指向前一个节点,并将三个指针向后移动一步。以下是反转单向链表的示例代码:

#include <iostream>
using namespace std;
struct ListNode {
 int val;
 ListNode *next;
 ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode* head) {
 ListNode *prev = NULL, *curr = head, *next = NULL;
 while (curr != NULL)
  next = curr->next;
  curr->next = prev;
  prev = curr;
  curr = next;
 
 return prev;
}
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);
 head->next->next->next->next = new ListNode(5);
 ListNode *newHead = reverseList(head);
 while (newHead != NULL)
  cout << newHead->val << " ";
  newHead = newHead->next;
 
 return 0;
}

以上代码首先定义了一个结构体 ListNode,表示链表的节点。节点包含一个整数值 val 和一个指向下一个节点的指针 next。我们定义了一个 reverseList 函数来反转链表。首先定义了三个指针 prev,curr 和 next,指向前一个节点、当前节点和下一个节点。在 while 循环中,我们将当前节点的 next 指针指向前一个节点,并将三个指针向后移动一步。最后,我们返回 prev 指向的节点,即反转后的链表的头结点。

在主函数中,我们创建了一个链表,使用 cout 显示反转后的链表。可以看到,反转链表的过程非常简单,只需要使用三个指针的方法就可以实现。

综上所述,C++反转操作是一个非常常见的编程技巧。无论是反转数组,反转字符串还是反转链表,都可以使用简单的指针操作来实现。在实际编程中,我们可以根据具体问题的要求选择不同的反转方法,以提高程序的效率和可靠性。

  
  

评论区

请求出错了