链表练习
链表是面试最常见的基础考察,高效、易记的代码是非常有助于提高答题效率的。
若有更简便、高效的思路请指教。
1 #include <iostream> 2 using namespace std; 3 4 struct node 5 { 6 int num; 7 node* p_next; 8 }; 9 10 //创建一个新节点 11 node* make_node(int num,node* p=NULL) 12 { 13 node* n = new node; 14 n->num = num; 15 n->p_next = p; 16 return n; 17 } 18 19 //释放链表内所有内存 20 void free_list(node* list) 21 { 22 if(list==NULL){ 23 return; 24 }else{ 25 free_list(list->p_next); 26 delete list; 27 } 28 } 29 30 //依次打印链表成员 31 void print_list(node* list) 32 { 33 while(list) 34 { 35 cout<<list->num<<" "; 36 list = list->p_next; 37 } 38 cout<<endl; 39 } 40 41 //链表反转 42 node* reverse_list(node* p) 43 { 44 node* prev = NULL; 45 node* next = NULL; 46 47 while(p) 48 { 49 next = p->p_next; 50 51 p->p_next = prev; 52 prev = p; 53 p=next; 54 } 55 56 return prev; 57 } 58 59 //有序链表合并 60 node* merge_list(node* h1,node* h2) 61 { 62 node* head = NULL; 63 node* p = NULL; 64 65 do{ 66 if(h1==NULL){ 67 if(head==NULL){ 68 return h2; 69 }else{ 70 p->p_next = h2; 71 return head; 72 } 73 } 74 if(h2==NULL){ 75 if(head==NULL){ 76 return h1; 77 }else{ 78 p->p_next = h1; 79 return head; 80 } 81 } 82 83 if(h1->num < h2->num){ 84 if(head==NULL){ 85 head = h1; 86 p = head; 87 }else{ 88 p->p_next = h1; 89 p = p->p_next; 90 } 91 h1 = h1->p_next; 92 }else{ 93 if(head==NULL){ 94 head = h2; 95 p = head; 96 }else{ 97 p->p_next = h2; 98 p = p->p_next; 99 } 100 h2 = h2->p_next; 101 } 102 }while(h1!=NULL || h2!=NULL); 103 } 104 105 int main() 106 { 107 node* h1 = NULL; 108 for(int i=1;i<20;i+=2) 109 h1 = make_node(i,h1); 110 print_list(h1); 111 112 node* h2 = NULL; 113 for(int i=2;i<23;i+=2) 114 h2 = make_node(i,h2); 115 print_list(h2); 116 117 h1 = reverse_list(h1); 118 h2 = reverse_list(h2); 119 print_list(h1); 120 print_list(h2); 121 122 node* head = merge_list(h1,h2); 123 print_list(head); 124 125 free_list(head); 126 }

浙公网安备 33010602011771号