summay 정리: 결국 보이드 린턴 함수를 만들기 위한 약간의 혼동의 값은 지불해야 하는듯.
그런데 print()와 print3() 이나 insertAfter(head,1,21); 와 insertAfter1(head,1,21); 경우는 언뜻 서로 같아보인다…어떤 경우에 차이가 드러나는 경우가 생길까?
#include <bits/stdc++.h>
using namespace std;
class node {
public:
int data;
node* next;
node(int value)
{
data = value;
next = NULL;
}
};
void insertAfter(node* head, int key, int val)
{
node* n = new node(val);
if (key == head->data) {
n->next = head->next;
head->next = n;
return;
}
node* temp ;
for( temp = head; temp->data != key; temp = temp->next)
// 템프는 헤드로 초기화시켜서 링크드리스트를 아이터레이터처럼 트래버스 시켜줌. 헤드와 같은게 아니라.
if (temp == NULL) // key가 없는 경우
return;
n->next = temp->next;
temp->next = n;
}
void insertAfter1(node*& head, int key, int val)
{
node* n = new node(val);
if (key == head->data) {
n->next = head->next;
head->next = n;
return;
}
node* temp ;
for( temp = head; temp->data != key; temp = temp->next)
// 템프는 헤드로 초기화시켜서 링크드리스트를 아이터레이터처럼 트래버스 시켜줌. 헤드와 같은게 아니라.
if (temp == NULL) // key가 없는 경우
return;
n->next = temp->next;
temp->next = n;
}
node* deleteFirst1(node *head)
{
if(head !=NULL)
{
node *temp = head;
head = head->next;
free(temp);
}
return head;
}
void deleteFirst2(node*& head)
{
if(head !=NULL)
{
node *temp = head;
head = head->next;
free(temp);
}
//return head;
}
void insertAtHead(node*& head, int val)
{
node* n = new node(val);
n->next = head;
head = n;
}
node* insertAtHead1(node* head, int val)
{
node* temp =head; // 오리지날 함수에서 이렇게 살짝 바꾸어줌
node* n = new node(val);
n->next = temp;
temp = n;
head=temp;
return head;
}
void insertAtHead2(node** head, int val)
{
node* temp =*head; // 오리지날 함수에서 이렇게 살짝 바꾸어줌
node* n = new node(val);
n->next = temp;
temp = n;
*head=temp;
}
void insertAtHead3(node* head, int val)
{
node* n = new node(val);
n->next = head;
head = n;
}
node* insertAtHead4(node* head, int val)
{
node* n = new node(val);
n->next = head;
head = n;
return head;
}
void print(node*& head)
{
node* temp = head;
while (temp != NULL) {
cout << temp->data << " -> ";
temp = temp->next;
}
cout << "NULL" << endl;
}
void print2(node*& head) // 이건 분명히 print(node*& head) 와 다르다.
{
while (head != NULL) {
cout << head->data << " -> ";
head = head->next;
}
cout << "NULL" << endl;
}
void print3(node* head) // 프린트1은 프린트3과 같은거 처럼 보인다.
{
node* temp = head;
while (temp != NULL) {
cout << temp->data << " -> ";
temp = temp->next;
}
cout << "NULL" << endl;
}
void print4(node* head) // 결국 프린트는 이게 가장 간단하며 좋은 방법인듯
{
//node* temp = head;
while (head != NULL) {
cout << head->data << " -> ";
head = head->next;
}
cout << "NULL" << endl;
}
int main()
{
node* head = NULL;
insertAtHead(head, 1); // 1 -> NULL
insertAtHead(head, 2); // 2 -> 1 -> NULL
//insertAtHead3(head, 1); // error
//insertAtHead3(head, 2); // error
//head=insertAtHead4(head, 1);
// head=insertAtHead4(head, 2);
//insertAtHead1(head, 1); // NULL
//insertAtHead1(head, 2); // NULL
//head=insertAtHead1(head, 1); // 1 -> NULL
//head=insertAtHead1(head, 2); // 2 -> 1 -> NULL
//insertAtHead2(&head, 1); // 1 -> NULL
//insertAtHead2(&head, 2); // 2 -> 1 -> NULL
print(head);
cout << endl;
//deleteFirst1(head); // 0 -> 1 -> NULL // Wrong!
//head=deleteFirst1(head); // 1 -> NULL
deleteFirst2(head); // 1 -> NULL // Correct!
print(head);
cout << endl;
insertAfter(head,1,21);
//insertAfter1(head,1,21);
print(head);
cout << endl;
return 0;
}