쉽게 알 수 있 는 단 사슬 표 (2) 사슬 표 / 고리 길이, 고리, 고리 입구
3441 단어 데이터 구조
//
int lengthNode(Node *node)
{
if (NULL == node)
{
cout << "error" << endl;
return 0;
}
int iLen = 0;
Node *pTmp = node;
while (pTmp->next) // ,
{
pTmp = pTmp->next;
iLen++;
}
return iLen;
}
2. 싱글 체인 시계 에 링 이 있 습 니까?
2.1 사상
두 개의 지침 을 설정 하면 모두 머리 결 점 을 가리 키 고 하 나 는 빨리 가 고 하 나 는 느리게 간다. 만약 에 고리 가 있 으 면 몇 걸음 후에 빠 른 지침 은 느 린 지침 한 바퀴 를 초과 할 것 이다.없 으 면 몇 걸음 후에 빨리 포인터 가 NULL 을 가리 키 세 요.
2.2 코드 구현
//
typedef struct node {
int val;
struct node *next;
}Node,*pNode;
//
bool isLoop(pNode pHead)
{
// pHead
//
pNode fast = pHead;
pNode slow = pHead;
// , fast
// ,fast->Next
// ,fast
while( fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
// , fast slow
if(fast == slow)
{
break;
}
}
if(fast == NULL || fast->next == NULL )
{
return false;
}
else
{
return true;
}
}
3. 싱글 체인 시계 링 입구
3.1 사상
첫 번 째 충돌 점 Pos 에서 연결 점 Join 까지 의 거리 = 헤드 포인터 에서 연결 점 Join 까지 의 거리 이기 때문에 느 리 고 빠 른 지침 은 각각 첫 번 째 충돌 점 Pos, 헤드 포인터 head 부터 가 는데 만 나 는 그 점 이 바로 연결 점 이다.
3.1.1 증명
링 에서 만난 후에 시작 점 에서 링 입구 까지 의 길 이 는 len1 이 고 링 입구 에서 만 남 점 까지 의 위 치 는 len2 이 며 링 의 길 이 는 R 이 라 고 가정 하면 느 린 지침: S = len1 + len2 빠 른 지침: 2S = len1 + R + len2 이기 때문에 다음 과 같이 밀어 낸다. len1 = R - len2 는 첫 번 째 충돌 점 Pos 에서 연결 점 Join 까지 의 거리 = 헤드 포인터 에서 연결 점 Join 까지 의 거 리 를 증명 한다.
3.2 코드 구현
Node* findLoopEntrance(pNode pHead)
{
pNode fast = pHead;
pNode slow = pHead;
while( fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
// , fast slow
if(fast == slow)
{
break;
}
}
if(fast == NULL || fast->next == NULL)
return NULL;
slow = pHead; //
while(slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
4. 싱글 체인 링 길이
4.1 사상
빠 르 고 느 린 포인터 가 처음 만 났 을 때 (한 바퀴 초과) 계산 하기 시 작 했 습 니 다. 카운터 가 누적 되 었 습 니 다. 두 번 째 만 났 을 때 계 수 를 멈 추고 두 번 째 만 났 을 때 빠 른 지침 이 느 린 지침 보다 좋 고 한 바퀴 더 걸 었 습 니 다. 즉, 더 걷 는 거 리 는 고리 가 긴 것 과 같 습 니 다.
4.2 코드 구현
//
int loopLength(pNode pHead)
{
// ,
if(isLoop(pHead) == false)
{
return 0; // ,
}
pNode fast = pHead;
pNode slow = pHead;
int length = 0; //
bool begin = false; // flag
bool agian = false; // flag
while( fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
// ,
if(fast == slow && agian == true)
{
break;
}
//
if(fast == slow && agian == false)
{
begin = true;
agian = true;
}
// +1
if(begin == true)
{
++length;
}
}
return length;
}
5. 참고
http://www.cnblogs.com/xudong-bupt/p/3667729.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.