本题要求实现一个函数,逆序输出不带头结点的单链表的的所有元素值。
函数接口定义:
void Reverse ( LinkList L );
其中LinkList结构定义如下:
L是不带头结点的单链表的头指针,即单链表首元素结点指针。
裁判测试程序样例:
输入样例:
输入是以-1结束的整数序列,-1不属于单链表元素,整数之间空格分隔。
2 1 4 5 3 -1
输出样例:
逆序输出单链表所有元素,格式为每个整数后面跟一个空格。
3 5 4 1 2
递归:
- 如果链表L为空,则直接返回。
- 接着,判断链表L的next指针是否为NULL,如果不为NULL,说明还有节点需要输出。
- 调用递归函数Reverse,传入L->next节点,实现逆序输出。
- 递归调用会一直进行,直到链表的最后一个节点。
- 最后,输出当前节点L的数据值。
void Reverse ( LinkList L )
{
if(L==NULL)
return;
if(L->next!=NULL)
Reverse(L->next);
printf("%d ",L->data);
}
思路2:
- 定义两个指针p和pn,分别指向链表L的头节点和第二个节点。
- 进入第一个while循环,循环条件是p不为NULL,即还有节点需要处理。
- 在循环中,将pn指向p的下一个节点。
- 进入第二个while循环,循环条件是pn不为NULL,即还有节点需要交换数据。
- 在循环中,将p节点的data与pn节点的data交换。
- 将pn指向pn的下一个节点,即pn向后移动一位。
- 循环结束后,输出当前节点p的data值。
- 将p指向p的下一个节点,即p向后移动一位。
- 重复步骤2到步骤8,直到遍历完整个链表。
使用了两层循环,外层循环用于遍历链表的每一个节点,内层循环用于将当前节点与后面的节点进行数据交换。然后,输出每个节点的data值,实现逆序输出整个链表的数据。
void Reverse ( LinkList L )
{
LinkList p=L;
LinkList pn;// 第二个节点
while(p)
{
pn=p;
pn=pn->next;
while(pn)
{
int temp=p->data;
p->data=pn->data;
pn->data=temp;
pn=pn->next;
}
printf("%d ",p->data);
p=p->next;
}
}