1. 程式人生 > >題目8  假定兩個帶頭節點的單鏈表,儲存單詞,字尾相同時共享相同空間,找出共同字尾的起始位置。

題目8  假定兩個帶頭節點的單鏈表,儲存單詞,字尾相同時共享相同空間,找出共同字尾的起始位置。

  • 假定兩個帶頭節點的單鏈表,儲存單詞,字尾相同時共享相同空間,找出共同字尾的起始位置。

首先:這裡給出建立的程式碼:至於createList函式,寫在了標頭檔案中,後面統一給出。
char word1[]={'l','o','a','d'};
	char word2[]={'p','l','a','y'};
	char last[]={'i','n','g'};
	Node* node1 = createList(word1, 4, true);//帶頭結點
	Node* node2 = createList(word2, 4, true);//帶頭結點
	Node* nodelast = createList(last, 3, false);//不帶帶頭結點
	//連線
	connect(node1, nodelast);
	connect(node2, nodelast);

void connect(Node*& A, Node*& B){
	if(A==NULL) return ;
	Node* p=A;
	while(p->next!=NULL){
		p=p->next;
	}
	p->next=B;
}
如loading 和 thing  相同的無疑是i
誤區:錯誤的認為可以簡單的理解為長度做減法,然後求倒數第一個,按照位置求解。
正確解法,求長度,從最大相同長度的位置開始比較,即從較短的單詞的第一個元素,較長的單詞的移動到和較短的對照的長度的位置處比較,比較指標地址。
Node* search_commonNode(Node *a, Node *b){
	int c1 = getListLength(a, true);//自定義工具函式,在標頭檔案中定義,計算長度 
	int c2 = getListLength(b, true);
	while(c1>c2){
		a=a->next;
		c1--;
	} 
	while(c1<c2){
		b=b->next;
		c2--;
	}
	while(a->next!=NULL and a->next!=b->next){
		a=a->next;
		b=b->next;
	}
	return a->next;
} 

上面這道題,看似簡單實際上比較容易理解錯誤,應該自己先理清邏輯,然後自己獨立實現試試。

作者:無涯明月

發文時間:2018-10-20