首页 > 代码库 > 第九十题(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.推断链表中存在环)