面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后该链表的头结点,链表定义如下:
Struct ListNode
{
Int M_nKey;
ListNode* m_pNext;
}
我的代码如下:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node *next;//指向下一个节点的地址
}Node,*List;//List== Node *
//单链表以NULL结尾
void InitList(Listplist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
plist->next = NULL;
}
ListBuyNode(int val)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
//p->next = NULL;
return p;
}
//头插
void Insert_Head(Listplist ,int val)
{
Node *p = BuyNode(val);
p->next = plist->next;//4
plist->next = p;//3
}
//从头到尾打印链表
void Show(List plist)
{
Node*p=plist->next;
for( ; p!= NULL ;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
void Reverse(List plist)
{
Node *p1=NULL;
Node *p2=plist;
Node *p3=NULL;
while(p2->next != NULL)
{
Node *tmp=p2->next;
if(tmp== NULL)
{
p1= p2;
}
p3=p2;
p2=tmp;
}
}
int main()
{
Node plist1;
plist1.next=NULL;
int i=0;
for(i=0; i<10; i++)
{
Insert_Head(&plist1 ,i);
}
Reverse(&plist1);
Show(&plist1);
return 0;
}