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


    1.不开辟用于交换数据的暂时空间,怎样完毕字符串的逆序

    2.删除串中指定的字符

    3.推断单链表中是否存在环

    分析和代码:

    1,不开辟用于交换的暂时空间,能够用异或交换。或者用字符串的''位置的空间(打个擦边球,使用已有空间。不算开辟大笑)。

    	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] = '';
    	}
    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] != '')
    			if (str[i] == c)
    				i++;
    			else
    				str[j++] = str[i++];
    		str[j] = '';
    	}
    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;
    	}



  • 相关阅读:
    .NET Core 3.0 部署在docker上运行
    Docker 微服务教程
    Docker 入门教程
    快速了解 Linux系统信息
    Navicat 连接本地MS-SQL服务器,只能用localhost无法使用127.0.0.1
    安装Ubuntu Server 18.04 并支持远程方式
    AdventureWorks 安装和配置[转自 微软msdn]
    SQL Server 2014 Agent 无法启动
    微信会死么
    ajax+php数据增加查询获取删除
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6815895.html
Copyright © 2020-2023  润新知