题目:
要求将一无头单链表的节点从尾到头打印出来。
这是一道经典的面试题,今天我们来介绍它的五种解决方法。
1 解决思路:
定义两个指针,一个指向链表头(pcur),一个指向每次要打印的节点(pprint)。每次让pcur来遍历,代码实现如下:
//从尾到头打印单链表
void THprint2(PNode pHead){
if (NULL == pHead){
return;
}
PNode pcur = NULL;
PNode pprint = NULL;
while (pprint != pHead){
pcur = pHead;
while (pcur->_pNext != pprint){
pcur = pcur->_pNext;
}
printf("%d", pcur->_data);
pprint = pcur;
}
}
但这种方法每打印一个节点就要遍历一次链表,时间复杂度为o(n^2);接受不了。
2 解决思路;
遍历一遍链表,将值存到数组里,倒着打印出来(这里就不实现了)。这种方法的时间复杂度为o(n),但空间复杂度为也为o(n)。
3 解决思路:
借助栈来实现,因为栈的特性为先进后出,所以可以遍历一遍链表,将节点push进栈,然后在pop弹出,将实现逆序打印。
4 可先将链表逆置过来,再遍历一次链表将节点打印出来,最