Programming/C C++

[DS] Reverse a doubly-linked list

양방향 연결 리스트 (순환X)의 방향을 바꾸는 코드를 작성해야 한다.

www.hackerrank.com/challenges/reverse-a-doubly-linked-list/problem

 

DoublyLinkedListNode* reverse(DoublyLinkedListNode* head) {
    DoublyLinkedListNode *link = malloc(sizeof(DoublyLinkedListNode));
    DoublyLinkedListNode *rever = malloc(sizeof(DoublyLinkedListNode));
    DoublyLinkedListNode *tmp = head;
    while(tmp ->next != NULL){
        tmp = tmp->next;
    }
    rever = tmp;
    while(1){
        link=tmp->prev;
        tmp->prev = tmp->next;
        tmp->next = link;
        if(tmp == head){
            break;
        }
        else{
            tmp = tmp->next;
        }
    }
    return rever;

}

△ 작성한 부분

우선 리스트의 가장 마지막 원소까지 접근한다. 그 노드는 reverse 한 리스트의 head 노드가 되기 때문에 따로 저장한다.reverse 리스트의 head 노드부터 양방향 노드의 순서를 바꾼다. 그리고 원래 리스트의 head 노드에 도달하기 전까지는 계속 앞쪽으로 나아가야 하기 때문에 reverse 된 상태에서의 next 노드로 접근해 반복한다.

SMALL

'Programming > C C++' 카테고리의 다른 글

Counting Valleys  (0) 2020.10.04
Drawing Book  (0) 2020.09.27
[DS] Delete a Node  (0) 2020.09.20
Migratory Birds  (0) 2020.09.20
[DS] Insert a node at a specific position in a linked list  (0) 2020.09.13