微软笔试题

  1 #include<iostream>
  2 using namespace std;
  3 
  4 /*
  5 链表节点
  6 */
  7 struct Node
  8 {
  9     int value;
 10     Node* next;
 11 };
 12 /*
 13 创建一个长度为len的链表,并返回链表头结点
 14 */
 15 Node* init(int len)
 16 {
 17     Node* head = new Node[len];
 18     if(head == NULL)
 19     {
 20         cout<<"new failed"<<endl;
 21         return NULL;
 22     }
 23     Node* p = head;
 24     for(int i = 1; i <= len ;p++, i++)
 25     {
 26         if( i < len )
 27         {
 28             p->value = i;
 29             p->next = p+1;
 30         }
 31         else
 32         {
 33             p->value = i;
 34             p->next = NULL;
 35         }
 36     }
 37     return head;
 38 }
 39 
 40 /*
 41 接受一个链表头结点,并将链表逆置,返回链表头结点
 42 */
 43 Node* reverse(Node* head)
 44 {
 45     if(head == NULL)
 46     {
 47         cout<<"链表为空"<<endl;
 48         return NULL;
 49     }
 50     if(head->next == NULL)
 51         return head;
 52     Node* n_head = reverse(head->next);
 53     head->next->next = head;
 54     head->next = NULL;
 55     return n_head;
 56 }
 57 
 58 /*
 59 遍历一个链表
 60 */
 61 void traverse(Node* head)
 62 {
 63     Node* ptr = head;
 64     while( ptr != NULL )
 65     {
 66         if(ptr->next != NULL)
 67             cout<<ptr->value<<"->";
 68         else
 69             cout<<ptr->value<<endl;
 70         ptr = ptr->next;
 71     }
 72 }
 73 /*
 74 0->1->2->3->4 ===>> 0->4->1->3->2
 75 0->1->2->3 ===>> 0->3->1->2
 76 思路:
 77 1、找到len/2+1的节点,生成两个链表a,b
 78 2、将b链表逆置
 79 3、将逆置后的b一个个插入a链表中
 80 */
 81 void function(Node* head, int len)
 82 {
 83     if(head == NULL || len <= 0)
 84         return;
 85     int    n_list_len = len/2 + 1;
 86     Node* n_head = NULL;
 87     Node* temp = head; 
 88     for(int i = 1; i < n_list_len; i++)
 89         temp = temp->next;
 90     n_head = temp->next;
 91     temp->next = NULL;
 92     Node* a = head;
 93     Node* b = reverse(n_head);
 94     while( b != NULL)
 95     {
 96         temp = b;
 97         b = b->next;
 98         temp->next = a->next;
 99         a->next = temp;
100         a = temp->next;
101     }
102 }
103         
104 int main()
105 {
106     Node* head;
107     int len = 0;
108     while(1)
109     {
110         cout<<"链表长度:";
111         cin>>len;
112         if(len <= 0)
113         {
114             cout<<"链表长度不能小于等于0"<<endl;
115             continue;
116         }
117         head = init(len);
118         traverse(head);
119         function(head,len);
120         traverse(head);
121         head = reverse(head);
122         traverse(head);
123     }
124     return 0;
125 }

 

posted @ 2013-10-04 17:29  GOD_YCA  阅读(944)  评论(1编辑  收藏  举报