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