链表练习

链表是面试最常见的基础考察,高效、易记的代码是非常有助于提高答题效率的。

若有更简便、高效的思路请指教。

 

  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 }

 

posted @ 2016-04-04 20:28  imBoCK  阅读(134)  评论(0)    收藏  举报