面试题7:单链表的反转/逆序
2016-03-28 22:26 Keiven_LY 阅读(442) 评论(0) 编辑 收藏 举报题目描述:
实现一个函数,输入一个单链表的头结点,反转该链表并输出反转后链表的头结点。
基本思路:
比如链表:1->2->3->4->5->6
1.定义三个指针pcur,pnext,prev;
2. pcur指向1, pnext指向2, prev指向3;
3. 首先pcur->next=NULL(第一个结点作为反转后的最后一个结点)
4. 然后pnext->next=pcur;让pcur=pnext,pnext=prev;
5. 这时1<-2 3->4->5->6 pcur指向2,pnext指向3,prev指向4
6. 重复第4步(pnext->next=pcur,pcur=pnext,pnext=pprev,此时1<-2<-3 4->5->6 依次类推)
功能函数:
/* 单链表的反转 */ Node *ReverseLinkList(Node *head) { if(head == NULL || head->next == NULL) return head; Node *pcur, *pnext, *prev; pcur = head->next; //pcur保存第一个结点 pnext = pcur->next; //pnext保存第二个结点 pcur->next = NULL; //反转后第一个结点变为最后一个结点 while(pnext != NULL) { prev = pnext->next; pnext->next = pcur; pcur = pnext; pnext = prev; } head->next = pcur; //反转后的第一个结点为原链表的最后一个结点 return head; }
完整可执行程序:
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; typedef struct node { int data; struct node *next; }Node; /* 创建含有n个结点的单链表 */ Node *CreateListHead(int n) { Node *head; head=(Node *)malloc(sizeof(Node)); /*创建头结点*/ Node *q = head; /* 初始化随机数种子 */ srand(time(0)); //srand函数在stdlib.h头文件中,time函数在time.h头文件中 for(int i=0; i < n; i++) { Node *p = (Node *)malloc(sizeof(Node)); p->data = rand()%100+1; //随机生成100以内的数字 p->next = q->next; q->next = p; q = p; } q->next = NULL; return head; } /* 单链表的反转 */ Node *ReverseLinkList(Node *head) { if(head == NULL || head->next == NULL) return head; Node *pcur, *pnext, *prev; pcur = head->next; //pcur保存第一个结点 pnext = pcur->next; //pnext保存第二个结点 pcur->next = NULL; //反转后第一个结点变为最后一个结点 while(pnext != NULL) { prev = pnext->next; pnext->next = pcur; pcur = pnext; pnext = prev; } head->next = pcur; //反转后的第一个结点为原链表的最后一个结点 return head; } /****打印单链表******/ void print(Node *head) { Node *p; if(head->next==NULL) { cout << "The LinkList is Empty !" <<endl; return; } p=head->next; while(p!=NULL) { cout << p->data << " " ; p=p->next; } } int main() { Node *SingleLinkList = NULL; int length; cout << "Please input the length of LinkList: " <<endl; cin >> length; SingleLinkList = CreateListHead(length); cout << "The new created LinkList as below: " <<endl; print(SingleLinkList); cout << endl; cout << "链表翻转后的结果为:" << endl; ReverseLinkList(SingleLinkList); print(SingleLinkList); cout << endl; system("pause"); return 0; }
运行结果: