一、双向指针基本用法
双向指针在需要遍历整个数组并前后交换数组元素时使用较广泛。
原理就是设置两个指针,分别从前后遍历整个数组,下面是基本的写法:
void Reverse(char arr[], int len)
{
int left = 0;
int right = len - 1;
int tmp;
while (left < right)
{
//条件
}
}
二、例题
2.1字符逆序
将一个字符串str的内容颠倒过来,并输出。
数据范围: 1 < len(str) < 10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
void Reverse(char arr[], int len)
{
int left = 0;
int right = len - 1;
char tmp;
while (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[10001];
gets(arr);//gets可以读取包括空格在内的字符串
int len = strlen(arr);
Reverse(arr, len);
printf("%s\n", arr);
}
2.2奇偶互换
题目:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分所有偶数位于数组的后半部分
思路:用双向指针遍历整个数组,总共可产生四种情况:
1.前奇后偶 //最理想的情况,不需进行操作 ——> left++ right--
2.前偶后奇 // ——> 交换left和right,left++ right--
3.前偶后偶 //需要把前偶换到后面,需要让right继续遍历 ——> right--
4.前奇后奇 //需要把后奇换到前面,需要让left继续遍历 ——> left++
题解:
void reverse(int arr[], int len)
{
int tmp;
int left = 0;
int right = len - 1;
while (left < right)
{
if (arr[left] % 2 == 0 && arr[right] % 2 == 1)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
else if (arr[left] % 2 == 0 && arr[right] % 2 == 0)
{
right--;
}
else if (arr[left] % 2 == 1 && arr[right] % 2 == 1)
{
left++;
}
else
{
left++;
right--;
}
}
}
int main()
{
int arr[10];
for (int i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
int len = sizeof(arr) / sizeof(arr[0]);
reverse(arr, len);
for (int i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}