用循环的方式来以reverse 的方式来展示单链表内容,小编目前只想到一种方法就是将所有的data存储到数组中,那么用循环的方式就可以将它们展示出来。
下面是展示.h file 里面的文件
//This is the list.h file
#include<iostream>
#include<cctype>
#include<cstring>
using namespace std;
struct node
{
int data;
node * next;
};
class list
{
public:
//These functions are provided for you
list(); //Supplied
~list(); //Supplied
void build(); //Supplied
void display(); //Supplied
//Display the LLL reverse
//Return the count of the display
int display_reverse();
private:
node * head;
node * tail;
};
下面展示的如何实现这个函数的代码
#include "list.h"
int list::display_reverse()
{
if(!head)
return 0;
int count = 0;
int * array = NULL;
while(head)
{
++count;
//这个是用来判定数组是否为空
//如果为空,那么就得声明这个数组来存储单链表里的内容
if(!array)
{
array = new int[count];
//count-1是指向当前的数组的下标
//将当前的内容存储到当前下标里
array[count-1] = head->data;
}
//如果这个数组不空
//那就得声明helper array来帮助存储之前所有的内容
else
{
//这个temp的数组就是用来存储数组已经已有的内容
int * temp = new int[count];
//用一个for循环来将所有之前array里面的内容全部导入到temp数组里
for(int I = 0; I<count-1; ++i)
{
temp[I] = array[I];
}
//count-1是表明当前的数组里的最后一个index下标
//将现在head指针所指的内容存到最后一个index下标里
temp[count-1] = head->data;
//将所有的array里的内容导入到temp数组里之后
//就得将这个array的数组删除掉
delete [] array;
array = NULL;
//又声明一个array的数组
//这次的array的数组是用来存储所有的链表的内容
array = new int[count];
//用for循环来将temp的数组导入到array里面
for(int I = 0; I<count; ++i)
{
array[I] = temp[I];
}
//导入完之后,将temp的数组删除掉
delete [] temp;
temp = NULL;
}
//现在array数组里已经存储到了head指针所指过的内容
//然后就得将head指针进行遍历
head = head->next;
}
//这是用for循环来将所有的array展示出来
for(int I = count; I>0; --I)
{
cout<<array[I-1]<<" ";
}
//展示完之后,就得将array删除掉
delete [] array;
array = NULL;
//返回已经展示了多少个数组内容
return count;
}
解释一下:
声明temp 的数组是专门存储当前单链表里的内容,而array数组是来声明存储所有单链表里的内容。
说实话,感觉用循环来做这道题目,很麻烦。
用上递归来做这道题目,几行代码就能做出来了,感觉更容易。
但是,对于还没接触递归的或者是刚接触递归的,用循环来做这道题目,更容易理解逻辑是怎么样的。
下面是展示结果:
希望这篇文章对刚学数据结构或者刚接触递归的同学们有帮助!