剑指offer-面试题16.反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的头结点
链表结点定义如下:
1 struct ListNode 2 { 3 int m_nKey; 4 ListNode* m_pNext; 5 }
其实反转链表主要是链表指针的操作,一定要很清楚才行。
其实在面试题5,从尾到头打印链表的第一种方式已经实现了
这种方式:
这里在梳理下反转链表的过程:
比如链表:1->2->3->4->5->6
1.定义三个指针p1,p2,p3
2.p1指向1,p2指向2,p3指向3
3.p2->next=p1;然后p1=p2,p3=p2
4.这时1<-2 3->4->5->6 p1指向2,p2指向3,p3指向4
5.重复第4步(p2->next=p1,p1=p2,p3=p2,此时1<-2<-3 4->5->6 依次类推)
6.结束条件为p2==NULL,最后将头结点的next指向NULL即可
实现如下:
1 #include <iostream> 2 using namespace std; 3 4 struct ListNode 5 { 6 int data; 7 struct ListNode *next; 8 }; 9 10 struct ListNode* CreateList() 11 { 12 struct ListNode* Head,*p; 13 Head=(struct ListNode*)malloc(sizeof(ListNode)); 14 Head->data=0; 15 Head->next=NULL; 16 p=Head; 17 18 cout<<"Create List....(0-exit!)"<<endl; 19 while(true) 20 { 21 int Data; 22 cin>>Data; 23 if(Data!=0) 24 { 25 struct ListNode* NewNode; 26 NewNode=(struct ListNode*)malloc(sizeof(ListNode)); 27 NewNode->data=Data; 28 NewNode->next=NULL; 29 p->next=NewNode; 30 p=p->next; 31 } 32 else 33 { 34 break; 35 } 36 } 37 38 return Head->next; 39 } 40 41 void PrintList(struct ListNode* Head) 42 { 43 cout<<"The List is: "; 44 45 struct ListNode *p; 46 p=Head; 47 while(p!=NULL) 48 { 49 cout<<p->data<<" "; 50 p=p->next; 51 } 52 cout<<endl; 53 } 54 55 struct ListNode* ReversePrint(struct ListNode* Head) 56 { 57 struct ListNode *p1,*p2,*p3; 58 59 p1=Head; 60 p2=p1->next; 61 62 while(p2!=NULL) 63 { 64 p3=p2->next; 65 p2->next=p1; 66 p1=p2; 67 p2=p3; 68 } 69 70 Head->next=NULL; 71 return p1; 72 } 73 74 int main() 75 { 76 ListNode *Head,*NewHead; 77 Head=CreateList(); 78 PrintList(Head); 79 NewHead=ReversePrint(Head); 80 81 cout<<endl<<"The Reverse List is:"<<endl; 82 PrintList(NewHead); 83 return 0; 84 }
运行截图:
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。