首页 > 代码库 > 第九十题(1.不开辟暂时空间交换 2.删除串中指定字符 3.推断链表中存在环)
第九十题(1.不开辟暂时空间交换 2.删除串中指定字符 3.推断链表中存在环)
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‘; }2.遍历一遍完毕字符(可能会有多个同样的字符)删除,切忌每删除一个字符就将其后的字符都前移一遍。这样非常耗时。应该设置两个下标。i、j。假设不删除字符[i]的话,把str[i]赋给str[j]。假设要删除。直接使i加1跳过要删除字符,不正确str[j]进行赋值,这样一次遍历就可以完毕。
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‘; }3.设置两个指针,slow和fast。slow每次前进一个节点。fast每次前进两个节点,两个指针从头结点同一时候出发,若链表中存在环,fast必定会追上slow指针,在两指针同样时返回true就可以。若指针到达链表结尾。必定无环,返回false
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.推断链表中存在环)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。