本人编写的单链表反转函数(原创非抄袭!简单易懂,欢迎拍砖)

算法思路:

链表翻转操作流程:

1、编写一个能返还原链表某个索引结点地址的子函数return_node(形参为头结点和索引号(从1开始))

2、翻转前,先遍历原来结点有多少个结点(不包括头结点),假设为list_length

3、采用for循环,每次循环都将相邻两个结点的地址取出,然后让其指向反转,相邻结点从后往前移动遍历

4、让原来结点的next指针域指向NULL,让原结点的头指针指向原结点的最后一个结点。

 

以上最关键就是第2点,相邻结点两两进行结点反转指向,需要用到临时变量temp1,temp2,而且让i从list_length递减到i=2就行了。

编写子函数是为了方便快速的根据索引快速的查找出结点地址。

直接放代码:

//链表翻转子函数.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//检索链表指定结点,并返回地址
node * return_node(node *head,int index)
{
node *p,*q;
p=head;
int count=0;

if(p->next==NULL)//空结点,返回-1
{
return  (node *)-1;
}
p=p->next;//记得移动到第一个结点
while(p!=NULL)
{
count++;
if(count==index)
{
    //printf("检索的索引为:%d,结点地址为:%x\r\n",count,p);
    return p;
}
p=p->next;

}

//链表翻转&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
int rever_node(node *head)
{
node * temp1,*temp2,*p,*temp;
int count=0;
int i;
//====================先遍历原来链表,看看多少个结点
p=head;
if(p->next==NULL)
{
cout<<"没有任何结点"<<endl;
return -1;
}
p=p->next;
while(p!=NULL)
{
temp=p;
p=p->next;
count++;
}
printf("原链表长度为:%d...开始反转...\r\n",count);
//==============================链表反转
temp=return_node(head,count);//把原来链表最后一个结点存起来
for(i=count;i>1;i--)
{

temp1=return_node(head,i);
temp2=return_node(head,i-1);
temp1->next=temp2;

}
head->next=temp;//让头指针指向原来最后一个结点
temp2->next=NULL;//原来第一个链表的结点指向空

return 0;
}

//测试结果&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值