문제

다음과 같은 링크 된 목록을 가로지 못하는 것이 궁금합니다.


currentNode = randomNode;//where randomNode may or may not = firstNode
prevNode = firstNode;
while(prevNode != currentNode && prevNode->link != currentNode)
{
    prevNode = prevNode->link;
}

단일 링크 된 목록에서 CurrentNode 전에 노드를 찾으려고 할 때 C ++ 에서이 작업을 수행 할 수 있습니까?

나는 학교 과제를 위해 콘솔 앱에서 이와 같은 것을 구현하려고 노력하므로 Boost 라이브러리/목록/삶을 더 쉽게 만드는 것 등과 같은 멋진 것을 사용할 수 없다고 가정합니다. 기본적으로 기본적으로, 나는 상당히 원시적 인 데이터 유형 만 가지고 있습니다. 내 처분에 라이브러리.

도움이 되었습니까?

해결책

CurrentNode가 실제로 연결되어 있지 않은 경우 Prevnode-> 링크가 Null 참조가 아닌지 확인할 수 있습니다.

다른 팁

그것은 잘 작동해야합니다. 아직 시도해 보셨습니까?

이 코드는 목록의 일부를 가로 지르지 만 어떤 부분이 목록이 연결되어 있는지에 따라 다릅니다. 헤드-> 꼬리에서 (읽기 : 헤드 노드 링크를 꼬리를 향한 노드로 링크) 임의 위치에서 꼬리까지 시작하는 목록을 가로 질러갑니다. 링크가 헤드 <-tail 인 경우 임의의 위치에서 머리까지 횡단됩니다. 두 경우 모두 목록의 모든 노드를 터치하지 않습니다.

위의 모든 부분은 다음과 같은 일부 링크 목록을 가정합니다.

[head]<->[0...N Nodes]<->[Tail]

링크는 어느 쪽이든일 수 있습니다.

또한 헤드와 테일 노드를 연결하고 원형 연결된 목록을 만들 수 있습니다. 이 시나리오에서는 원래 노드로 돌아올 때까지 간단히 이동하여 모든 노드를 방문 할 수 있습니다.

가능한 모든 엣지 케이스를 고려하십시오.

  • 무슨 일이야 randomNode 동등합니다 firstNode? 당신은 무엇을 반환합니까? 뭐 ~해야 한다 돌아 오나요?
  • 언제 일어날 지 randomNode 목록의 마지막 노드입니까?
  • 언제 일어날 지 randomNode ~이다 NULL?
  • 언제 일어날 지 randomNode 목록에 없습니까?

이제, 당신이 알고 있는지에 따라 이러한 모든 사례가 적용되는 것은 아닙니다. randomNode, 이들 중 일부는 사소 할 수 있습니다. 그러나 그들은 모두 생각할 가치가 있습니다.

이 모든 것을 매우 신중하게 고려한다면, 그들 모두를 처리하는 간단하고 우아한 솔루션이 있습니다.

코드는 괜찮아 보이지만 나는 당신의 작은 변화를 제안합니다 while 상태

while(prevNode != currentNode && prevNode != NULL)

두 가지 이유로

  • 현재 명시된대로 귀하의 코드는 우리가 찾고있는 노드가 prevNode 또는 prevNode->link (따라서 우리는 두 가지 중 하나가 currentNode - 우리가 알고 싶다면 if 상태). 위의 변경으로 대상 노드는 prevNode (전혀 - 다음 지점을 참조하십시오).
  • 안전을 위해서, 그것을 확인하는 것이 좋을 것입니다. prevNode 아니다 NULL. 그러나 Pavel이 언급 했듯이이 테스트는 불필요합니다. currentNode 목록에 보장됩니다.

댓글에 대한 응답으로 편집

당신이 알 필요가 없다는 것을 감안할 때 currentNode 들어 왔습니다 prevNode 또는 prevNode->link, 그리고 당신이 멈추고 싶기 때문에 (가능하면) currentNode == prevNode->link, 그럼 당신의 원본 while 괜찮습니다. 하지만...

코드에 더 높은 IF 문이 있습니다. prevNode 벌써 널이어서

왜 확인 해야하는지에 대한 요점이없는 것 같습니다. NULL. 예, 전에 확인하기 전에 좋습니다. 그러나 우리가 가진 이유는 NULL 루프를 확인하십시오 currentNode ~이다 ~ 아니다 목록에서 결국 마지막 노드에 도달합니다. 아마도 (대부분의 다른 링크 된 목록과 마찬가지로 이것을하는 경우) link 마지막 노드는입니다 NULL. 그렇다면 현재 코드는 결국 NULL->link 물론 어느 것이 당신의 프로그램에 충돌 할 것인지. 그렇기 때문에 여전히 확인해야합니다 NULL

while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)

당신이 확실히 확실합니다 저것 currentNode 목록에있을 것입니다 추측 그 수표는 또한 불필요하지만 실제로 들어가는 좋은 습관입니다.

당신은 가질 수 있습니다 :

while (prevNode && prevNode != currentNode)
    prevNode = prevNode->link;

그러나 당신이 가진 것은 괜찮아 보입니다.

게시 된대로 코드로 변경하는 작은 것은 (CurrentNode가 목록에 있지 않거나 다른 오류 처리가 아닌 경우 목록의 끝을 실행하는 다른 답변에서 논의 된 가능성을 제외하고) While 루프가 완료된 경우입니다. 당신은 있는지 모릅니다 prevNode 또는 prevNode->link ~를 가리키다 currentNode. 이것은 큰 문제가 아니지만 (쉽게 테스트 할 수 있기 때문에) 검색 전에이 특별한 사례 상황을 테스트하는 것이 가장 좋았으므로 특별한 경우라는 것이 분명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top