面试100题之17

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:
struct ListNode
{ int m_nKey;ListNode* m_pNext; };

分析:通常在单链表的首元结点(存放第一个数据元素的结点)之前附设一个头结点(数据域什么都不放),称之为带头结点的单链表,反之就是不带头结点的单链表。如果是带头结点的链表反转后头结点应该还放在最开始。

带头结点的单链表反转:

  
  
  
  
  1. #include<stdafx.h>  
  2. #include<iostream>  
  3. #include <deque>  
  4. using namespace std;  
  5. struct ListNode  
  6. int m_nKey;  
  7. ListNode* m_pNext;   
  8. };  
  9.  
  10. void InvertList(ListNode *head)  
  11. {  
  12.     ListNode* pre=NULL;  
  13.     ListNode* p=head->m_pNext;  
  14.     ListNode* pnext;  
  15.     if(p==NULL)  
  16.         return;  
  17.     while(p!=NULL)  
  18.     {  
  19.         pnext=p->m_pNext;  
  20.         p->m_pNext=pre;  
  21.         pre=p;  
  22.         p=pnext;  
  23.     }  
  24.     head->m_pNext=pre;  
  25. }  
  26. void main()  
  27. {  
  28.     ListNode a[5];  
  29.     ListNode head;//头结点  
  30.     a[0].m_nKey=0;  
  31.     a[1].m_nKey=1;  
  32.     a[2].m_nKey=2;  
  33.     a[3].m_nKey=3;  
  34.     a[4].m_nKey=4;  
  35.     a[0].m_pNext=&a[1];  
  36.     a[1].m_pNext=&a[2];  
  37.     a[2].m_pNext=&a[3];  
  38.     a[3].m_pNext=&a[4];  
  39.     a[4].m_pNext=NULL;  
  40.     head.m_pNext=&a[0];  
  41.     ListNode *tmp=head.m_pNext;  
  42.     for(int i=0;i<5;i++)  
  43.     {  
  44.         cout<<tmp->m_nKey<<endl;  
  45.         tmp=tmp->m_pNext;  
  46.     }  
  47.     InvertList(&head);  
  48.     tmp=head.m_pNext;  
  49.     for(int i=0;i<5;i++)  
  50.     {  
  51.         cout<<tmp->m_nKey<<endl;  
  52.         tmp=tmp->m_pNext;  
  53.     }  

不带头结点的单链表反转

  
  
  
  
  1. #include<stdafx.h>  
  2. #include<iostream>  
  3. #include <deque>  
  4. using namespace std;  
  5. struct ListNode  
  6. int m_nKey;  
  7. ListNode* m_pNext;   
  8. };  
  9.  
  10. ListNode * InvertList(ListNode *head)  
  11. {  
  12.     ListNode* pre=NULL;  
  13.     ListNode* p=head;  
  14.     ListNode* pnext;  
  15.     if(p->m_pNext==NULL)  
  16.         return p;  
  17.     while(p!=NULL)  
  18.     {  
  19.         pnext=p->m_pNext;  
  20.         p->m_pNext=pre;  
  21.         pre=p;  
  22.         p=pnext;  
  23.     }  
  24.     return pre;  
  25. }  
  26. void main()  
  27. {  
  28.     ListNode a[5];  
  29.     a[0].m_nKey=0;  
  30.     a[1].m_nKey=1;  
  31.     a[2].m_nKey=2;  
  32.     a[3].m_nKey=3;  
  33.     a[4].m_nKey=4;  
  34.     a[0].m_pNext=&a[1];  
  35.     a[1].m_pNext=&a[2];  
  36.     a[2].m_pNext=&a[3];  
  37.     a[3].m_pNext=&a[4];  
  38.     a[4].m_pNext=NULL;  
  39.     ListNode *tmp=&a[0];  
  40.     for(int i=0;i<5;i++)  
  41.     {  
  42.         cout<<tmp->m_nKey<<endl;  
  43.         tmp=tmp->m_pNext;  
  44.     }  
  45.     ListNode *newhead=InvertList(&a[0]);  
  46.     tmp=newhead;  
  47.     for(int i=0;i<5;i++)  
  48.     {  
  49.         cout<<tmp->m_nKey<<endl;  
  50.         tmp=tmp->m_pNext;  
  51.     }  

 

你可能感兴趣的:(单链表逆转)