21xrx.com
2024-11-22 06:09:59 Friday
登录
文章检索 我的文章 写文章
C++反转操作
2023-07-07 19:58:38 深夜i     --     --
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++反转操作是一个非常常见的编程技巧。无论是反转数组,反转字符串还是反转链表,都可以使用简单的指针操作来实现。在实际编程中,我们可以根据具体问题的要求选择不同的反转方法,以提高程序的效率和可靠性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复