字串反轉是程式設計中經典的基礎操作之一,常見於面試題目與實際開發需求。本文將透過一個完整的 C++ 範例,詳細解析如何使用雙指標法就地反轉字元陣列,並附上完整原始碼與關鍵步驟說明。
最直觀且高效的做法是使用兩個指標分別指向字串的頭尾,然後交換所指字元並向中間移動,直到兩指標相遇。此法時間複雜度為 O(n),空間複雜度為 O(1),是原地反轉的最佳選擇。
/*
version: 1.0
author: hellogiser
blog: https://www.cnblogs.com/hellogiser
date: 2014/5/30
*/
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
char *reverse_str(char *str)
{
if (NULL == str)
return str;
unsigned int len = strlen(str);
char *start = str;
char *end = str + len - 1;
while (start < end)
{
swap(start, end);
start++;
end--;
}
return str;
}
strlen 取得字串長度(不含結尾的 \0)。start 指向首字元,end 指向最後一個有效字元(str + len - 1)。start < end 確保只交換到中間為止,避免重複交換或越界。swap 函式提高程式碼可讀性與復用性。可編寫簡單的 main 函式呼叫 reverse_str 並輸出結果,確認「Hello」變為「olleH」等。建議搭配單元測試框架自動化驗證邊界情況(空字串、單字元、超長字串)。
若使用 C++ 標準庫,只需一行 std::reverse(str, str + strlen(str)) 即可達成相同效果,且經過高度優化。理解底層實作有助於在嵌入式或無標準庫環境下靈活應對。