单链表的逆置

1 问题

如何实现单链表中的数据进行逆置。

2 方法

  1. 方法一头插法:利用头插法重新建立带节点的新链表,逆置链表初始为空,表中节点从原链表中依此“删除”,在逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个节点,如此循环,直至原链表为空;
  2. 方法二递归:先假定有一个函数,可以将以head为头结点的单链表逆序,并返回新的头结点。利用这个函数对问题进行求解:将链表分为当前表头结点和其余部分,递归的过程就是,先将表头结点从链表中拆出来,然后对其余部分进行逆序,最后将当前的表头结点链接到逆序链表的尾部。递归的终止条件就是链表只剩一个节点时,直接返回这个节点。

代码清单 1

#方法一
#include
#include
typedef struct List{
int data;
struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
{
LIST* head=NULL;
for(int i=5;i>=1;i--)
{
LIST* newhead=(LIST *)malloc(sizeof(LIST));
newhead->data=i;
newhead->next=head;
head=newhead;
}
return head;
}
//打印输出
void print(LIST* P)
{
while(P!=NULL)
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
return;
}
//单链表反转(头插法)
LIST* reverse(LIST* head)
{
LIST *temp=NULL,*Phead=NULL;
while(head!=NULL)
{
temp=head;
head=head->next;
temp->next=Phead;
Phead=temp;
}
return Phead;
}
int main ()
{
printf("原来的链表的数据:\n");
LIST* P=CreatSlist();
print(P);
printf("反转后链表的数据:\n");
LIST* head=reverse(P);
print(head);
return 0;
} #方法二
#include
#include
typedef struct List{
int data;
struct List* next;
}LIST;
//表的初始化,不带头节点,
LIST* CreatSlist()
{
LIST* head=NULL;
for(int i=5;i>=1;i--)
{
LIST* newhead=(LIST *)malloc(sizeof(LIST));
newhead->data=i;
newhead->next=head;
head=newhead;
}
return head;
}
//打印输出
void print(LIST* P)
{
while(P!=NULL)
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
return;
}
//单链表反转(递归法)
LIST* reverse(LIST* head)
{
if(head==NULL||head->next==NULL)
return head;
LIST *new_head=reverse(head->next);
head->next->next=head;
head->next=NULL;
return new_head;
}
int main ()
{
printf("原来的链表的数据:\n");
LIST* P=CreatSlist();
print(P);
printf("反转后链表的数据:\n");
LIST* head=reverse(P);
print(head);
return 0;
}

3 结语

针对如何实现单链表的逆置,提出利用头插法和递归法进行处理,通过利用IDLE编写,证明该方法是有效的,通过本次实验加深单链表基本处理操作,为更深入的有关单链表的操作积累了经验,有助于提升对单链表的操作能力。

你可能感兴趣的:(单链表的逆置)