1. 程式人生 > >第九十題(1.不開辟暫時空間交換 2.刪除串中指定字符 3.推斷鏈表中存在環)

第九十題(1.不開辟暫時空間交換 2.刪除串中指定字符 3.推斷鏈表中存在環)

net 異或 img == pre def return 分享 存在

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.推斷鏈表中存在環)