您的位置:首页 > 其它

第九十题(1.不开辟临时空间交换 2.删除串中指定字符 3.判断链表中存在环)

2014-07-05 14:38 295 查看
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;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐