本题要求实现一个反转链表
1 2 3 4 5 6
6 5 4 3 2 1
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct st{
int data;
struct st * Next;
}NODE,*PNODE;
PNODE creat_list();
void traverse_list1(PNODE pHead);
void traverse_list2(PNODE pHead);
PNODE reverse_list(PNODE pHead );
void traverse_list(PNODE pHead);
int main(void)
{
PNODE pHead=NULL;
pHead=creat_list();//创建
printf("链表反转前的数据\n");
traverse_list1(pHead);
pHead=reverse_list(pHead->Next);//反转
printf("链表反转后的数据\n");
traverse_list2(pHead);
free(pHead);
}
//创建单链表
PNODE creat_list()
{
int len;
int i;
int val;
PNODE pHead=NULL;
pHead=(PNODE)malloc(sizeof(NODE));
if(NULL==pHead)
{
printf("分配内存失败,请重新输入");
}
PNODE pTail=pHead;
pTail->Next=NULL;
printf("请您输入需要链表的的个数%d",len);
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请您输入链表的%d个节点的值",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
printf("分配内存失败,请重新输入");
}
else{
pNew->data=val;
pTail->Next=pNew;
pNew->Next=NULL;
pTail=pNew;
}
}
return pHead;
}
//遍历输出
void traverse_list1(PNODE pHead)
{
PNODE p=NULL;
p=pHead->Next;
while(p)
{
printf("%d ",p->data);
p=p->Next;
}
printf("\n");
}
void traverse_list2(PNODE pHead)
{
PNODE p=NULL;
p=pHead;
while(p)
{
printf("%d ",p->data);
p=p->Next;
}
printf("\n");
}
//非递归反转
/*PNODE reverse_list(PNODE pHead)
{
PNODE p,q,r;
p = pHead;
q=r=NULL;
while(p)
{
q = p->Next;
p->Next = r;
r = p;
p = q;
}
return r;
}*/
//递归反转
PNODE reverse_list(PNODE pHead){
if(pHead==NULL||pHead->Next==NULL){
return pHead;
}
PNODE cur=reverse_list(pHead->Next);
pHead->Next->Next=pHead;
pHead->Next=NULL;
return cur;
}
在本题中可以采用两种方法,就地反转和非递归反转(这个有些不懂)
就地反转,将第二个节点的指针域指向第一个节点,然后循环依次往复。
注意:在这边需要注意的是,在指向过程中要断开将其第一个节点和第二个指针的连接,否则会造成循环链表。数据也会出现错误。