赞
踩
本题最主要的问题就是设计反转的算法,我为大家提供两种可行思路的代码,大家可以选择最适合自己的算法进行程序设计。
问题描述
输入一个链表,反转链表后,输出链表的所有元素。
输入说明
输入第一行为整数n(n>=1),代表测试链表数。
从第二行开始每行表示一个链表,其中第一个数据表示链表中数据个数,其余数据表示要测试的链表中的数据,均为整数。
输出说明
每一行对应一个链表反转后的元素。
输入样例
3
5 1 2 3 4 5
3 2 4 5
1 3
输出样例
5 4 3 2 1
5 4 2
3
- #include<iostream>
- #include<cstdio>
- #include<malloc.h>
- using namespace std;
-
- typedef struct LinkList{
- int num;
- LinkList *next;
- }LinkList;
-
- LinkList* creatList(int cnt){
- LinkList* head, * s, *r;
- head=(LinkList*)malloc(sizeof(LinkList)); //生成头节点head
- r = head; //尾指针指向头节点
- for(int i=0; i<cnt;i++){
- s=(LinkList*)malloc(sizeof(LinkList)); //生成新节点*s
- cin>>s->num;
- r->next = s; //新节点插入表尾
- r = s; //尾指针指向新表尾
- }
- r->next = NULL;
- return head; //返回表头指针
- }
-
- void reversal(LinkList *L){
- LinkList *p = L->next;
- LinkList *r = p->next;
- //指针遍历
- while(p->next != NULL){
- p->next = r->next;
- r->next = L->next;
- L->next = r;
- r = p->next;
- }
- // LinkList *p = NULL
- // LinkList *cur = L;
- // while(cur) {
- // LinkList *r = cur->next;
- // //将cur头插到新链表
- // cur->next = p;
- // p = cur;
- // cur = r;
- // }
- }
-
- void print(LinkList *L){ //遍历整个链,输出结果
- LinkList *p;
- p = L;
- while(p!=NULL){
- if(p->next){
- cout<<p->next->num<<' ';
- }
- p = p->next;
- }
- }
-
- int main()
- {
- int i, j;
- int cnt = 0;
- cin>>j;
- LinkList *L[j];
- for(i=0;i<j;i++){ //利用循环进行创建链表
- cin>>cnt;
- L[i] = creatList(cnt);
- reversal(L[i]); //利用原来链表位置进行反转链表存储
- }
- for(i=0;i<j;i++)
- {
- print(L[i]);
- if(i!=j-1)
- cout<<'\n';
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。