题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
这题我目前有两个思路,把这个链表做成反向链表,另一个是用递归的方法。其实还可以用栈来实现,但是考虑到栈比较麻烦就算了。
递归方法:
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
void Display(struct ListNode *listnode)
{
if(listnode==NULL)
return ;
else
{
Display(listnode->m_pNext);
printf("%d ",listnode->m_nKey);
}
}
int main()
{
struct ListNode *listnode ;
listnode=(struct ListNode *)malloc(sizeof(struct ListNode));
listnode->m_nKey=10;
listnode->m_pNext=NULL;
struct ListNode *temp;
temp=(struct ListNode *)malloc(sizeof(struct ListNode));
temp->m_nKey=5;
temp->m_pNext=listnode;
listnode=temp;
Display(listnode);
getchar();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
struct ListNode * ReverNode( struct ListNode *listnode )
{
if(listnode==NULL )
return NULL;
struct ListNode *pre=NULL;
struct ListNode *temp=listnode;
struct ListNode *p_temp=listnode;
while(p_temp!=NULL)
{
//一定要注意这里的顺序,,ABCD ,比如p_temp现在指在 B 处,你要先把 p_temp 的指针指向 C ,
//才能将 B 指向 A ,否则 CD 会丢掉的。然后还要将 B 记录下来,不然你等下也找不到呢。
p_temp=p_temp->m_pNext;
temp->m_pNext=pre;
pre=temp;
temp=p_temp;
}
return pre;
}
void Display(struct ListNode *listnode)
{
struct ListNode *tempnode=listnode;
while(tempnode!=NULL)
{
printf("%d ",tempnode->m_nKey);
tempnode= tempnode->m_pNext;
}
printf("\n");
}
int main()
{
struct ListNode *listnode ;
struct ListNode *tempnode ;
listnode=(struct ListNode *)malloc(sizeof(struct ListNode));
listnode->m_nKey=10;
listnode->m_pNext=NULL;
//弄了两个数据测试一下。
tempnode=(struct ListNode *)malloc(sizeof(struct ListNode));
tempnode->m_nKey=5;
tempnode->m_pNext=listnode;
listnode=tempnode;
listnode=ReverNode( listnode);
Display(listnode);
getchar();
return 0;
}