第九十題(1.不開辟暫時空間交換 2.刪除串中指定字符 3.推斷鏈表中存在環)
阿新 • • 發佈:2017-05-06
net 異或 img == pre def return 分享 存在
2.遍歷一遍完畢字符(可能會有多個同樣的字符)刪除,切忌每刪除一個字符就將其後的字符都前移一遍。這樣非常耗時。應該設置兩個下標。i、j。假設不刪除字符[i]的話,把str[i]賦給str[j]。假設要刪除。直接使i加1跳過要刪除字符,不正確str[j]進行賦值,這樣一次遍歷就可以完畢。
3.設置兩個指針,slow和fast。slow每次前進一個節點。fast每次前進兩個節點,兩個指針從頭結點同一時候出發,若鏈表中存在環,fast必定會追上slow指針,在兩指針同樣時返回true就可以。若指針到達鏈表結尾。必定無環,返回false
1.不開辟用於交換數據的暫時空間,怎樣完畢字符串的逆序
2.刪除串中指定的字符
3.推斷單鏈表中是否存在環
分析和代碼:
1,不開辟用於交換的暫時空間,能夠用異或交換。或者用字符串的‘\0‘位置的空間(打個擦邊球,使用已有空間。不算開辟)。
void switch1(char* str) //使用異或交換 { int len = strlen(str); for (int i = 0; i < len / 2; i++) str[i] ^= str[len - i - 1] ^= str[i] ^= str[len - i - 1]; } void switch2(char* str) //借用字符串結束符的位置 { int len = strlen(str); for (int i = 0; i < len / 2; i++) { str[len] = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = str[len]; } str[len] = ‘\0‘; }
void deleteChar(char* str,char c) { int i = 0, j = 0; while (str[i] != ‘\0‘) if (str[i] == c) i++; else str[j++] = str[i++]; str[j] = ‘\0‘; }
bool hasLoop(node* head) { node *slow=head, *fast=head; while (fast!=NULL&&fast->next != NULL) { fast = fast->next->next; slow = slow->next; if (fast == slow) return true; } return false; }
第九十題(1.不開辟暫時空間交換 2.刪除串中指定字符 3.推斷鏈表中存在環)