운없이 여러 가지 다른 솔루션을 찾고 시도했다고 말하면서 시작하겠습니다. 나는 이것에 대해 너무 오랫동안 일해 왔기 때문에 어떤 도움이라도 대단히 감사하겠습니다.
할당은 카드 한 벌을 나타내는 연결 목록을 섞는 것입니다. 모든 메서드 선언을 받았으며 재귀 만 사용할 수 있다고 들었습니다. 나는 운없이 생각할 수있는 모든 가능한 방법으로 이것에 대해 갔다.
기본적으로 우리가 사용하는 전략은 연결된 목록을 2로 분할하고 두 목록을 섞은 다음 (재귀 적으로 shuffle 메서드를 호출하여) 섞은 목록을 다시 병합하는 것입니다.
알아야 할 몇 가지 사항 :
이 코드는 빈 목록을 반환하고 이유를 알 수 없습니다 (분명히). LLN-> shuffle ()은 셔플 된 목록의 헤드를 반환해야합니다. 지금은 빈 목록을 반환하고 있습니다.
LLN * LLN::merge(int len, LLN *b, int blen) {
//cout << "len: " << len << ", blen: " << blen << endl;
if (len == 0) return b;
if (blen == 0) return this;
int r = rand() % (len + blen) + 1; // between 1 and (len + blen)
if (r <= len) {
if (next)
next = next->merge(len - 1, b, blen);
else
next = b;
return this;
} else {
if (b->getnext())
b->setnext(b->getnext()->merge(blen - 1, this, len));
else
b->setnext(this);
return b;
}
}
LLN *LLN::shuffle(int len) {
if (len == 1)
return this;
LLN *tmp = split();
int thisLength = (len + 1) / 2; // for an odd numbered length, "this" list is 1 node larger
int tmpLength = len / 2;
shuffle(thisLength);
tmp = tmp->shuffle(tmpLength);
return merge(thisLength, tmp, tmpLength);
}
이것이 메소드가 호출되는 방법입니다.
void LL::shuffle() {
if (head != NULL)
head = head->shuffle(size);
}
LL (Linked List) 개체는 표준 52 개 카드 (각 카드가 노드 임)로 초기화됩니다.
다른 것이 필요하면 알려주세요.
매우 감사합니다!
교수님의 도움으로 문제를 파악할 수있었습니다. 내 오류는 내 split () 메서드의 기본 사례에있었습니다. 그 고정으로 모든 것이 잘 작동합니다. 나는 또한 Charlie의 제안을 적용했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다