一盖高、字符串反轉
給定字符串
Hello, world
, 實現(xiàn)將其反轉慎陵。輸出結果dlrow,olleh
。
思路:使用兩個指針喻奥,一個指向字符串首部begin席纽,一個指向字符串尾部end。遍歷過程逐漸交換兩個指針指向的字符映凳,結束條件begin大于end胆筒。
void char_reverse(char * cha) {
// 指向第一個字符
char *begin = cha;
// 指向字符串末尾
char *end = cha + strlen(cha) - 1;
while (begin < end) {
// 交換字符邮破,同時移動指針
char temp = *begin;
*(begin++) = *end;
*(end--) = temp;
}
}
二诈豌、鏈表反轉
思路:頭插法實現(xiàn)鏈表反轉仆救。定義一個新的head指針作為鏈表的頭部指針,定義一個P指針遍歷鏈表矫渔,將每次遍歷到的元素插入到head指針后彤蔽。
代碼示例:
// 鏈表反轉
struct Node * reverseList(struct Node *head) {
// 定義變量指針,初始化為頭結點
struct Node *p = head;
// 反轉后的鏈表頭
struct Node *newH = NULL;
while (p != NULL) {
// 記錄下一個結點
struct Node *temp = p -> next;
p->next = newH;
// 更新鏈表頭部為當前節(jié)點
newH = p;
// 移動P指針
p = temp;
}
return newH;
}
// 構建一個鏈表
struct Node * constructList(void) {
// 頭結點
struct Node *head = NULL;
// 記錄當前節(jié)點
struct Node *cur = NULL;
for (int i = 0; i < 5; i++) {
struct Node *node = malloc(sizeof(struct Node));
node->data = i;
if (head == NULL) {
head = node;
} else {
cur->next = node;
}
cur = node;
}
return head;
}
// 打印鏈表
void printList(struct Node *head) {
struct Node *temp = head;
while (temp != NULL) {
printf("node is %d \n", temp->data);
temp = temp->next;
}
}
測試代碼:
struct Node *head = constructList();
printList(head);
printf("---------\n");
struct Node *newHead = reverseList(head);
printList(newHead);
輸出結果:
node is 0
node is 1
node is 2
node is 3
node is 4
node is 4
node is 3
node is 2
node is 1
node is 0
三庙洼、有序數(shù)組合并
如何實現(xiàn)兩個有序數(shù)組合并成新的有序數(shù)組顿痪。
思路:兩個指針分別指向兩個有序數(shù)組,比較指針所指向的數(shù)據(jù)大小油够,將較小的先插入到新的數(shù)組中蚁袭,最后剩余的那個數(shù)組合并到新數(shù)組末尾。
示例代碼:
// 將有序數(shù)組a和b的值合并到一個數(shù)組result中石咬,且仍保持有序
void mergeSortedArray(int a[], int aLen, int b[], int bLen, int result[]) {
int p = 0; // a 數(shù)組標記
int q = 0; // b 數(shù)組標記
int i = 0; // 當前存儲位標記
// 任意數(shù)組結束
while (p < aLen && q < bLen) {
// 將較小的按個插入到新數(shù)組中
if (a[p] <= b[q]) {
result[i] = a[p];
p++;
} else {
result[i] = b[q];
q++;
}
i++;
}
// a數(shù)組還有剩余
while (p < aLen) {
result[i] = a[p++];
i++;
}
// b數(shù)組有剩余
while (q < bLen) {
result[i] = b[q++];
i++;
}
}
測試代碼:
void array_mergeSortedTest() {
int a[5] = {1, 3, 4, 5, 9};
int b[6] = {2, 8, 10, 23, 32, 43};
int result[11];
mergeSortedArray(a, 5, b, 6, result);
printf("merge result is ");
for (int i = 0; i < 11; i++) {
printf("%d ", result[i]);
}
}
輸出結果:
merge result is 1 2 3 4 5 8 9 10 23 32 43
示例代碼倉庫地址:Algorithm