题目描述
建立长度为n的单链表,然后将其数据元素逆置,即第1个元素变为最后一个元素,第2个元素变为倒数第2个元素,以此类推,最后一个元素变为第1个元素。(处理的数据类型为字符型。必须使用链表完成。)
输入
第一行为链表长度n;
第二行为链表中的n个数据元素的值。逆置后的原始值
输出
逆置后的原始值
递归解法
递归的关键问题
- 找到重复子问题
- 递归结束条件
题目分析
函数体
建设当前结点为phead
我们可以先将phead-next先逆置在将其与phead链接
再将phead与逆置后的phead->next链接
ListNode* reverseList(ListNode* phead)
{
//逆置phead->next链表,递归调用函数reverseList
ListNode* newhead = reverseList(phead->next);
//将逆置后的phead->next与phead相连
phead->next->neaxt = phead;
//将phead->next置空
phead->next = NULL
}
结束条件
当前只用一个结点或者没有结点时不需要逆置了,直接返回当前结点即可
ListNode* reverseList(ListNode* phead)
{
if(phead==NULL || phead->next==NULL) return phead;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode
{
char data;
ListNode* next;
}LN;
void List_crate(LN*& phead, char x)
{
LN* newnode = (LN*)malloc(sizeof(LN));
newnode->data = x;
newnode->next = NULL;
if (phead == NULL)
{
phead = newnode;
}
else
{
LN* cur = phead;
while (cur->next)
{
cur = cur->next;
}
cur->next = newnode;
}
}
LN* reverseList(LN* phead)
{
if (phead == NULL || phead->next == NULL)return phead;
LN* newnhead = reverseList(phead->next);
phead->next->next = phead;
phead->next = NULL;
return newnhead;
}
void list_print(LN* phead)
{
while (phead)
{
printf("%c ", phead->data);
phead = phead->next;
}
}
int main()
{
LN* L1 = NULL;
int n;
char ch;
scanf("%d", &n);
getchar();
for (int i = 1; i <= n; i++)
{
scanf("%c", &ch);
List_crate(L1, ch);
}
list_print(reverseList(L1));
return 0;
}