# Reverse a linked list (Linked List)
[문제]

[코드]
SinglyLinkedListNode* reverse(SinglyLinkedListNode* llist) {
SinglyLinkedListNode* two=NULL, *three;
while (llist) {
three=two;
two=llist;
llist=llist->next;
two->next=three;
}
return two;
}
[코드설명]
llist : 다음 노드를 가리킴two : link를 변경할 노드three : 변경할 link의 값
llist는 다음 노드를 가리킨다. three와 two는 llist를 따라 다음 link로 움직인다. 다음 노드로 이동할 때마다 노드의 link를 반대로 연결해주어야 한다. 따라서 two->next를 이전 노드인 three로 바꿔준다. two의 next가 변경되었으므로 다음 노드로 이동할 때는 llist를 사용해서 이동한다. 마지막으로 llist가 NULL이라는 건 더이상 다음으로 노드가 없다는 뜻이므로 반복문을 종료하고 two를 리턴한다. (llist가 NULL일 때 two는 리스트의 마지막 노드를 가리킴)
[채점 결과]

# Tree: Preorder Traversal (Trees)
[문제]

[코드]
void preOrder( struct node *root) {
if(root)
{
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
}
[코드설명]
preOrder를 재귀함수로 해결했다. 먼저 root가 NULL이면 출력할 노드가 없다는 뜻이므로 if문으로 걸러준다.
if문이 참이면 부모 노드가 먼저 출력되어야 하므로 현재 노드의 값을 print하고, 다음 자식 노드로 이동하게 해줬다.
자식 노드로 이동한 후에도 마찬가지로 자신의 값을 먼저 출력 후 다음 자식 노드로 이동하게 된다.
[채점 결과]
