C ++의 단독 링크 목록을 가로 지르고 있습니다
-
19-09-2019 - |
문제
다음과 같은 링크 된 목록을 가로지 못하는 것이 궁금합니다.
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
. 이것은 큰 문제가 아니지만 (쉽게 테스트 할 수 있기 때문에) 검색 전에이 특별한 사례 상황을 테스트하는 것이 가장 좋았으므로 특별한 경우라는 것이 분명합니다.