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; }