c++ 아래 짧은 링크드 리스트 코드중 2가지 궁금한것

ee 76.***.207.158

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;
}