第九十题(1.不开辟暂时空间交换 2.删除串中指定字符 3.推断链表中存在环)
Posted slgkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九十题(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.推断链表中存在环)的主要内容,如果未能解决你的问题,请参考以下文章