Skip to main content Link Menu Expand (external link) Document Search Copy Copied

12303. 기초 Single Linked List 연습

Code Battle (`23 동계 대학생 S/W 알고리즘 특강 기초학습 문제)


본 게시글은 개인 학습 용도로 작성한 게시글입니다.

(문제 출처: SW Expert Academy)


  • 노드를 정적 할당하여 Single-linked list를 구현하는 문제.
  • head가 nullptr 일 경우에 대한 처리가 은근히 신경써야했던 부분이었다.

#define MAX_NODE 10000

struct Node
{
    int data;
    Node *next;
};

Node node[MAX_NODE];
int nodeCnt;
Node *head;

Node *getNode(int data)
{
    node[nodeCnt].data = data;
    node[nodeCnt].next = nullptr;
    return &node[nodeCnt++];
}

void init()
{
    nodeCnt = 0;
    head = nullptr;
}

void addNode2Head(int data)
{
    Node *newNode = getNode(data);
    if (head != nullptr)
    {
        newNode->next = head;
    }
    head = newNode;
}

void addNode2Tail(int data)
{
    if (head == nullptr)
    {
        addNode2Head(data);
        return;
    }
    Node *newNode = getNode(data);
    Node *currNode = head;
    while (currNode->next != nullptr)
    {
        currNode = currNode->next;
    }
    currNode->next = newNode;
}

void addNode2Num(int data, int num)
{
    if (num == 1)
    {
        addNode2Head(data);
        return;
    }
    Node *newNode = getNode(data);
    Node *prevNode = head;
    for (int i = 2; i < num; i++)
    {
        prevNode = prevNode->next;
    }
    if (prevNode == head)
    {
        head = newNode;
    }
    newNode->next = prevNode->next;
    prevNode->next = newNode;
}

void removeNode(int data)
{
    Node *prevNode = nullptr;
    Node *currNode = head;
    while (currNode != nullptr)
    {
        if (currNode->data != data)
        {
            prevNode = currNode;
            currNode = currNode->next;
            continue;
        }
        if (prevNode == nullptr)
        {
            head = currNode->next;
        }
        else
        {
            prevNode->next = currNode->next;
        }
        return;
    }
}

int getList(int output[MAX_NODE])
{
    Node *currNode = head;
    int currIndex = 0;
    while (currNode != nullptr)
    {
        output[currIndex] = currNode->data;
        currNode = currNode->next;
        currIndex++;
    }
    return currIndex;
}

Back to top