자료구조/리스트(List)

[자료구조] 환형 링크드 리스트(Circular Linked List/CLL) - 코딩밥상

코딩밥상 2022. 12. 24. 17:33

환형 링크드 리스트란?

Head노드가 Tail노드와 연결되어있는 형태의 링크드 리스트입니다. 이 외에는 더블 링크드 리스트와 동일합니다.

 

 

이렇게되면 시작을 알면 끝을 알 수 있고, 끝을 알면 시작을 알 수 있습니다. 즉 끝에서 끝으로의 접근의 비용이 대폭 감소합니다.

특히 추가 연산 함수의 성능을 획기적으로 개선할 수 있습니다.

두 가지만 기억합시다.

  • Tail노드는 Head노드의 '이전 노드'입니다.
  • Head노드는 Tail노드의 '다음 노드'입니다.

사실상 이 두 가지가 더블 링크드 리스트와의 차이점입니다.


 

주요 연산(ADT)

DLL와 함수 구현이 다른 부분만 적어보겠습니다. 이 외의 함수들은 구현이 정말 비슷하거나 심지어 동일합니다.

 

  • 노드 추가 연산
void CDLL_AppendNode(Node** Head, Node* NewNode){    //노드 추가
    if((*Head) == NULL){    //헤드 노드가 NULL이면(기존 노드가 없으면), 새로운 노드가 Head
        *Head = NewNode;
        (*Head)->NextNode = *Head;
        (*Head)->PrevNode = *Head;
    }
    else{   //테일을 찾아 NewNode를 연결
        Node* Tail = (*Head)->PrevNode;
        
        Tail->NextNode->PrevNode = NewNode;   //헤드의 이전 노드는 새로운 노드
        Tail->NextNode = NewNode;
        
        NewNode->NextNode = (*Head);    //새로운 노드를 새로 연결
        NewNode->PrevNode = Tail;
    }
}

 

추가되는 노드가 Tail이 되기때문에 앞서 기억해야할 두가지 특성을 새로 관리해줍니다.


  • 노드 삭제 연산
void CDLL_RemoveNode(Node** Head, Node* Remove){     //노드 삭제
    if (*Head == Remove){   //Head를 삭제할 경우
        if((*Head) != NULL){
            (*Head)->PrevNode->NextNode = Remove->NextNode;
            (*Head)->NextNode->PrevNode = Remove->PrevNode;
            
            *Head = Remove->NextNode;
            
            Remove->NextNode = NULL;
            Remove->PrevNode = NULL;
        }
    }
    else{
        Remove->PrevNode->NextNode = Remove->NextNode;
        Remove->NextNode->PrevNode = Remove->PrevNode;
        
        Remove->PrevNode = NULL;
        Remove->NextNode = NULL;
    }
}

 

이미 추가연산을 통해 Tail과 Head를 연결해주었기때문에 DLL와 크게 다른점은 없습니다.


  • 노드 개수 세기 연산(번외)
int CDLL_GetNodeCount(Node* Head){    //노드 갯수 세기
    int count = 0;
    Node* Current = Head;
    
    while(Current != NULL){ //Head부터 Tail까지 카운트 업
        Current = Current->NextNode;
        count++;
        
        if(Current == Head) break;
    }
    return count;
}

 

DLL과 다르게 종료조건을 써주지 않으면 계속해서 순환하기때문에 꼭 써줘야합니다.

 


 

DLL복습하기

2022.12.24 - [자료구조/리스트(List)] - [자료구조] 더블 링크드 리스트(DoublyLinkedList/DLL) - 코딩밥상

 

[자료구조] 더블 링크드 리스트(DoublyLinkedList/DLL) - 코딩밥상

더블 링크드 리스트란? 앞서 싱글 링크드 리스트에 대해서 포스팅했습니다. 텍스트 자체에서 알 수 있듯이 이번엔 양방향 노드에 대해서 연결되어있는 구조입니다. 즉 이전 노드를 가리키는 포

sheepseung.tistory.com