데이터 구조 면접 중 하나 인 단일 체인 테이블 흔 한 조작

데이터 구조 면접 중 하나 인 단일 체인 테이블 흔 한 조작
제목: 는 관련 연습 문제 가 있 지만 생각 이 상대 적 으로 뚜렷 하지 않 고 조판 에 오류 가 있 습 니 다. 본 고 는 이에 대해 관련 서적 과 자신의 관점 을 참고 하여 재 작성 하여 여러분 께 참고 하도록 하 겠 습 니 다.
1. 링크 요소 찾기
Step 1: 찾기 태그 bfound = false 설정;링크 가 비어 있 는 지 여 부 를 판단 하 는 것 은 '빈 링크 를 찾 을 수 없습니다' 라 는 것 입 니 다.아니오, step 2 에 들 어 갑 니 다.
Step 2: 링크 헤드 부터 찾 아 보 세 요.
Step 3: 판단 bfound = = true, 예, "힌트 찾기 성공", 아니오, "힌트 찾기 실패".
/       
template<typename Type>
void linkedlistType<Type>::search(const Type& searchItem)
{
       nodeType<Type> *current;
       bool found = false;
 
       if(first == NULL)                                          //1.   
       {
              cout << "WARNING: Can not search an empty list!" << endl;
              return;
       }
       else
       {
              current = first;
              while(!found && current != NULL)
              {
                     if(current->info == searchItem)
                     {
                            found = true;
                            break;
                     }
                     else
                     {
                            current = current->link;
                     }
              }
              if(found)
              {
                     cout << searchItem << " was found in the List! " << endl;
              }
              else
              {
                     cout << searchItem << " was not found in the List! " << endl;
              }
       }
}

2. 링크 요소 값 삭제
Step 1: 찾기 태그 bfound = false 설정;링크 가 비어 있 는 지 여 부 를 판단 하 는 것 은 '빈 링크 를 삭제 할 수 없습니다' 라 는 것 입 니 다.아니오, step 2 에 들 어 갑 니 다.
Step 2: 삭제 해 야 할 요소 값 이 헤드 노드 요소 값 과 같 는 지 판단 합 니 다. 예, 헤드 노드 지침 을 조정 합 니 다.아니오, step 3 에 들 어 갑 니 다.
Step 3: 링크 에 이 요소 가 존재 하 는 지 여 부 를 판단 합 니 다. "제시 요소 가 존재 하지 않 습 니 다".네, step 4 에 들 어 갑 니 다.
Step 4: 요소 가 끝 노드 요소 값 과 같 는 지 판단 합 니 다. 예, 끝 last 지침 을 조정 합 니 다.아니오, 이 때 는 중간 노드 입 니 다. trailCurrent 와 Current 포인터 의 방향 을 조정 해 야 합 니 다.
//       
template<typename Type>
void linkedlistType<Type>::deleteNode(const Type& deleteItem)
{
       nodeType<Type> *tempNode = new nodeType<Type>;
       nodeType<Type> *current = new nodeType<Type>;
       nodeType<Type> *trailCurrent = new nodeType<Type>;
       bool found;
      
       //     case1
       if(first == NULL)
       {
              cout << "Can not delete an empty List!" << endl;
       }
       else
       {
              if( first->info == deleteItem )
              {
                     //           (     ,       ) case2
                     tempNode = first;
                     first = first->link;
                     if(first == NULL)
                     {
                            last = NULL;
                     }                         
                     delete tempNode;
              }
              else
              {
                     //   ,   ... case3
                     found = false;
                     trailCurrent = first;
                     current = first->link;
 
                     while((!found) && (current != NULL))
                     {
                            if(deleteItem  != current->info)
                            {
                                   trailCurrent = current;
                                   current = current->link;
                            }
                            else
                            {
                                   found = true;
                            }
                     }
 
                     if(found)
                     {
                            //   ...
                            trailCurrent ->link = current->link;
 
                            if(current == last)
                            {
                                   last = trailCurrent; //case 3a
                            }
                            delete current;         //case 3b
                     }
                     //     ...case4
                     else
                     {
                            cout << "The deleteItem is not Exist in the List! " << endl;
                     } //end else
              }//end else
       }//end else
      
}// end deleteNode

3. 단일 체인 표 역 치 [교체 실현]
Step 1: 링크 가 비어 있 는 지 여 부 를 판단 하 는 것 은 '빈 링크 에 대해 역 설정 작업 을 할 수 없다' 는 것 이다. 아니, Step 2 에 들 어 가 는 것 이다.
Step 2: 두 번 째 노드 부터 각 노드 를 첫 번 째 노드 의 앞 에 순서대로 삽입 하여 포인터 가 링크 의 끝 을 가리 키 는 지 판단 합 니 다. 예, 돌아 오 는 포인터 가 끝 났 는 지, 아 닌 지, 뒤의 링크 요 소 를 계속 교체 합 니 다.
template<typename Type>
nodeType<Type>* linkedlistType<Type>::reverseList()   //     
{
       if(first == NULL)
       {
              cout << "Can't reverse empty List!" << endl;
       }
       else
       {
              nodeType<Type>* p = first;
              nodeType<Type>* q = p->link;
 
              while(q != NULL)
              {
                     p->link = q->link;
                     q->link = first;
                     first = q;
                     q = p->link;
              }
       }
       return first;
}

4. 단일 링크 정렬 [직접 정렬 삽입]
사고방식: 다음 과 같은 몇 가지 상황 으로 나 뉜 다.
1)  단일 체인 시계 가 비어 있 습 니 다.
2)  단일 체인 표 는 비어 있 지 않 지만 하나의 요소 만 포함 하고 정렬 할 필요 가 없습니다.
3)  머리 노드 보다 작은 요 소 를 삽입 할 때;
4)  삽입 할 요 소 는 질서 있 는 중간 요소 값 입 니 다.
5)  삽입 할 요소 앞 에 있 는 모든 요 소 는 그 보다 작 아서 바로 끝 에 꽂 습 니 다.
각각 lastInOrder 로 질서 있 는 마지막 노드 를 기록 합 니 다. firstOutOfOrder 의 첫 번 째 정렬 되 지 않 은 노드 입 니 다. current 는 순환 하 는 노드 를 기록 하고 trailCurrent 는 current 전의 노드 를 기록 합 니 다.
template<typename Type>
void linkedlistType<Type>::sortList()     //     
{
       nodeType<Type>* current;
       nodeType<Type>* trailCurrent;
       nodeType<Type>* lastInOrder;
       nodeType<Type>* firstOutOfOrder;
 
       lastInOrder = first;
 
       //case1,   .
       if(first == NULL)
       {
              cout << "Can't Sort of empty List!" << endl;
              return;
       }
 
       //case2,    ,    1,  1   .
       if(first->link == NULL)
       {
              cout << "The List Was Already ordered!" << endl;
              return;
       }
 
       while(lastInOrder->link != NULL)
       {
              firstOutOfOrder = lastInOrder->link;    
              //case3,         1   .
              if(firstOutOfOrder->info < first->info)
              {
                     lastInOrder->link = firstOutOfOrder->link;
                     firstOutOfOrder->link = first;
                     first = firstOutOfOrder;
              }
              else
              {    
                     trailCurrent = first;
                     current = first->link;
                     while(current->info < firstOutOfOrder->info)
                     {
                            trailCurrent = current;
                            current = current->link;
                     }
 
                     //case4,                .
                     if(trailCurrent != lastInOrder)
                     {
                            lastInOrder->link = firstOutOfOrder->link;
                            firstOutOfOrder->link = current;
                            trailCurrent->link = firstOutOfOrder;
                     }
                     else
                     {
                            //case5,                   .
                            lastInOrder = lastInOrder->link;
                     }//end else
              }//end else
       }//end while
}

5. 단일 체인 테이블 은 체인 테이블 의 길 이 를 모 르 는 전제 에서 체인 테이블 중간 노드 의 값 을 구한다.
사고방식: 다음 과 같은 몇 가지 상황 으로 나 뉜 다.
1)  링크 가 비어 있 습 니 다.
2)  링크 는 비어 있 지 않 지만 하나 또는 두 개의 노드 만 있 고 첫 번 째 노드 의 요소 값 을 직접 되 돌려 줄 수 있 습 니 다.
3)  링크 가 비어 있 지 않 지만 세 개 이상 의 노드 를 포함 하고 있 습 니 다. 두 개의 지침 을 정의 할 수 있 습 니 다. 한 지침 의 스텝 이 2 번 일 때 다른 지침 의 스텝 은 1 번 입 니 다. 끝까지 뛰 었 을 때 다른 노드 는 중간 에 있 습 니 다.
/ / 표 의 길 이 를 모 르 는 전제 에서 단일 체인 표 중간 요 소 를 구하 십시오.
template<typename Type>
Type linkedlistType<Type>::midValOfList()         
{
       nodeType<Type> *current;
       nodeType<Type> *halfCurrent;
 
       if(first == NULL)                                //case1,    
       {
              cout << "    !" << endl;
              return -1;
       }
       else if(first->link == NULL || first->link->link == NULL) //case2,          .
       {
              return first->info;
       }
       else                                   //case3,            .
       {
              current = first;
              halfCurrent = current;
 
              while(current->link != NULL)
              {
                     current = current->link;
                     if(current->link != NULL)
                     {
                            if(current->link != NULL)
                            {
                                   halfCurrent = halfCurrent->link;
                                   current = current->link;
                            }//end if
                     }
              }//end while
              return halfCurrent->info;
       }//end else
}

6. 단일 체인 테이블 구축
사고방식: 단일 체인 테이블 의 구축 은 새로운 노드 를 삽입 하 는 위치 에 따라 두 가지 로 나 눌 수 있다. 1: 체인 테이블 끝 에 요 소 를 삽입 하 는 구축 방식, 2: 체인 테이블 앞 에 요 소 를 삽입 하여 체인 테이블 을 만 드 는 방식 이다.
대응 하 는 1 끝 삽입 은 두 단계 로 나 뉜 다.
Step 1: 현재 링크 가 비어 있 으 면 first = last = new Node 를 설정 합 니 다. 그렇지 않 으 면 Step 2 에 들 어 갑 니 다.
Step 2: 새로운 노드 요 소 를 삽입 하고 last 지침 을 수정 합 니 다.
2. 링크 first 포인터 앞 에 삽입: 요 소 를 삽입 한 후에 first 노드 를 수정 하면 됩 니 다.
//      
template<typename Type>
nodeType<Type>* linkedlistType<Type>::buildListForward()
{
       nodeType<Type>  *newNode;
 
       int num;
       cout << " Enter a list of integer end with -999. " << endl;
       cin >> num;
       while(num != -999)
       {
              //..add
              newNode = new nodeType<Type>;
              newNode->info = num;
              newNode->link = NULL;
 
              if(first==NULL)
              {
                     first = newNode;
                     last = newNode;
              }
              else
              {
                     last->link = newNode;
                     last = newNode;
              }
              cin >> num;
       }
       return first;
}
 
//      ,     ...
template<typename Type>
nodeType<Type>* linkedlistType<Type>::buildListBackward()
{
       nodeType<Type>  *newNode;
 
       int num;
       cout << " Enter a list of integer end with -999. " << endl;
       cin >> num;
       while(num != -999)
       {
              //..add
              newNode = new nodeType<Type>;
              newNode->info = num;
              newNode->link = first;
              first = newNode;
              cin >> num;
       }
       return first;
}

7. 싱글 체인 시트 의 길이 측정
사고방식: 체인 테이블 의 길이 등 효 과 는 노드 개수 이 고 바늘 이 비어 있 지 않 으 면 순환 적 으로 판단 하면 된다.
//      
template<typename Type>
int linkedlistType<Type>::length()
{
       int count = 0;
       nodeType<Type> *current;
       current = first;
 
       while(current != NULL)
       {
              count++;
              current = current->link;
       }
       return count; //         .
}

8. 싱글 체인 시트 의 삽입
사고방식: 체인 테이블 의 삽입 도 체인 테이블 의 구축 과 마찬가지 로 전방 향, 후방 향 삽입 두 가지 형식 으로 나 뉘 는데 first, last 지침 의 지향 문 제 를 주의해 야 한다.
//     
template<typename Type>
void linkedlistType<Type>::insertFirst(const Type& newItem)
{
       //last no use.
       nodeType<Type> *newNode = new nodeType<Type>;
       newNode->info = newItem;
       newNode->link = first;   //     ...
       first = newNode;
}
 
//       ...
template<typename Type>
void linkedlistType<Type>::insertLast(const Type& newItem)
{
       nodeType<Type> *newNode = new nodeType<Type>;
       newNode->info = newItem;
       newNode->link = NULL;   //     ...
 
       if(first == NULL)
       {
              first = newNode;
              last = newNode;
       }
       else
       {
              last->link = newNode;
              last = newNode;
       }
}

다음 에 스 택, 대기 열, 이 진 트 리, 그림, 정렬, 찾기 등 관련 분석 이 있 을 것 입 니 다. 관심 가 져 주 십시오!

좋은 웹페이지 즐겨찾기