题目很简单吧,就是把一个单链表反转,注意一点,反转后尾指针的next要指向NULL; 反转的思路是先令指针p=pHead;然后令指针q=pHead->next;接着pHead=q->next;最后反转前面的位置q->next=p;p=q; 循环!
面试题不是很难,但要细心,我还不够细心。要做一个缜密的程序猿,加油!
#include<stdio.h> #include<iostream> using namespace std; typedef struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} } ListNode,*LinkList; class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *p,*q,*en; p=pHead; en=p; if(pHead)/**注意头指针为空的情况,考虑要周详*/ { if(pHead->next) { q=pHead->next; while(q->next) { pHead=q->next; q->next=p; p=q; q=pHead; } pHead->next=p; en->next=NULL; } } return pHead; } void CreatList(LinkList &L,int n) { LinkList q,p; // L=(LinkList)malloc(sizeof(ListNode)); L=new ListNode(NULL); // L->next=NULL;//创建一个不带带头结点的单链表 p = L; //L为头结点 if(n>0) cin>>p->val; int x; for(int i=0; i<n-1; i++) { cin>>x; q=new ListNode(x); p->next=q; p = q ; } } }; int main() { Solution so; int n; scanf("%d",&n); ListNode* L; so.CreatList(L,n); ListNode* ans=so.ReverseList(L); while(ans) { printf("%d\t",ans->val); ans=ans->next; } // vector<int>::iterator it; // printf("%d\n",ans[0]); // for(it=ans.begin();it!=ans.end();it++) // printf("%d\t",*it); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010579068/article/details/48263575