非递归算法:
首先定义两个尾指针tail1和tail2,遍历链表使tail1指向链表的尾节点,然后输出数据,再使tail2等于tail1记录该节点,第二次遍历时使tail1指向tail2的前一个节点,输出数据,依次类推完成打印。
递归算法:
若该节点的下一个节点为空的时候直接打印,若不为空传入下一个节点为参数再次执行打印函数,完成递归。
代码实现:
结构体定义及函数声明:
typedef struct SListNode
{
struct SListNode* _next;
DataType _data;
}SListNode;
void SLitsPrintTailToHead(SListNode* pHead);//从尾到头打印
void SListPrintTailToHeadR(SListNode* pHead);//从尾到头打印 递归
函数实现:
void SLitsPrintTailToHead(SListNode* pHead)
{
assert(pHead);
SListNode* tail1=pHead;
SListNode* tail2 = NULL;
while (tail2 != pHead)
{
while (tail1->_next != tail2)
{
tail1 = tail1->_next;
}
printf("%d->", tail1->_data);
tail2 = tail1;
tail1 = pHead;
}
printf("\n");
}
void SLitsPrintTailToHeadR(SListNode* pHead)
{
assert(pHead);
if (pHead->_next != NULL)
{
SLitsPrintTailToHeadR(pHead->_next);
}
printf("%d->", pHead->_data);
}