定义链表结点
typedef int datatype;
typedef struct Node
{
datatype data;
struct Node *next;
}Node, *pLinklist;
思路一:递归实现
要想将链表从尾到头打印,我们首先想到的方法应该是递归,每次访问到一个结点的时候,递归访问后面结点,最后打印自己。
代码实现
void PrintLinkTailToHead(pLinkList pl)
{
if(pl != NULL)
{
if(pl->next != NULL)
{
PrintLinkTailToHead(pl->next);
}
printf("%d--->",pl->data);
}
思路二:设置标识指针
设置一个标识指针,每次将好一个结点的值打印完,将尾标识指针根据前边的保留值向前移动,在依次打印前边的结点数据就可以了。
代码实现
void PrintLinkTailToHead(pLinkList pl)
{
Node* tail = NULL;
while (pl != tail)
{
Node* cur = pl;
while (cur->next != tail)
{
cur = cur->next;
}
printf("%d--->", cur->data);
tail = cur;//移动尾标识指针指向上一个结点
}
printf("over\n");
}
思路二:利用栈的“先进后出”
要想做到将单链表倒着打印,其实就是首先遍历的结点最后打印,这就是典型的“先进后出”。没遍历一个结点时,把当前结点压栈,当把链表遍历完之后,将栈里的元素依次出栈,此时的结果正是倒着的。
代码实现
- 声明栈的类型
#define MAXSIZE 100
typedef struct stack
{
DataType data[MAXSIZE];
int top;//指向栈顶的指针
}stack;
- 从尾到头打印单链表
void PrintLinkTailToHead(pLinkList pl)
{
stack* s;
memset(s->data, 0, sizeof(s->data));
s->top = 0;//初始化栈
Node* cur = pl;
while (cur != NULL)
{
s->data[s->top++] = cur->data;
cur = cur->next;
}
while (s->top > 0)
{
printf("%d--->", s->data[--s->top]);
}
printf("over\n");
}