倒序遍历链表

来源:互联网 发布:新会人民法院 淘宝拍卖 编辑:程序博客网 时间:2024/05/21 07:09

1.使用数组存储

//设L为带头结点的单链表,实现从尾到头反向输出每个节点的值 void reverseOutput(Node* L){//将值遍历,存放在数组中, 然后倒序输出 Node* r;r = L->next; int arr[maxSize];int i = 0;while(r!=NULL) {arr[i++] = r->data;r = r->next;}i--;//回到数组末尾 while(i>=0){printf("%d ",arr[i]);i--;}} 
注:(1)这种方法虽然可行,但是效率不高,因为空间复杂度为O(n),所以就有有了下面这种使用递归的手法来完成倒序输出链表。

2.使用递归

void reverseOutputLinkList (Node* L){Node* r;r = L->next;//r指向首元结点 if(r->next != null){reverseOutputLinkList(r);//继续调用 }printf("%d ",r->data);}

看到这里的代码,不禁拍手称快,递归竟然是这般神奇!程序中需要注意以下几个地方:

(1)不要在if后添加else,否则程序只能输出链表最后一个数据,因为其余的条件都不满足(r->next!=null)。

(2)当程序出现错误时,可以跑一个简单的链表测试一下,就知道哪里出现了错误。比如说只有一个头结点和一个首元结点的链表,就知道该怎么控制指针的初始值的设置了。不过建议考生还是记住初始值的设置,这样会方便做题。

(3)如图分析:


1 0