1.先整体反转。方法是用首尾指针交换两个元素并让指针向中间移动直到相遇。
2.再以单词为界局部反转。方法同样是首尾指针法,关键是找到左右边界,左边界是第一个不是空格的位置,用指针i做好标记,然后用另一个指针j继续遍历寻找第一个空格出现的位置,j-1即为右边界,如此一个一个单词反转。
void reverseall(char* s, int begin, int end){ //整体反转函数
char tmp;
while(begin < end){
tmp = s[begin];
s[begin] = s[end];
s[end] = tmp;
begin++;
end--;
}
}
char* ReverseSentence(char* str ) {
int i = 0, j = 0, n = strlen(str);
int from = 0, to = n-1;
reverseall(str, from, to); //先整体反转
while(i < n){
while(str[i] == ' ') //不是空格时继续前进找左边界
i++; //找到左边界时停
j = i; //右指针从左边界开始寻找
while(j < n && str[j] != ' ') //直到找出第一个空格出现的位置
j++;
reverseall(str, i, j-1); //右边界为j-1, 局部反转
i = j; //更新左指针的位置继续寻找下一个单词
}
return str;
}

京公网安备 11010502036488号