单链表的逆转

关于点链表的逆转,主要在于reverse函数中

     在一个博主那看懂他他关于实现逆转的详细解释:

1).开始的时候,创建一个指针域空的指针为Prev, 指向内容为空(NULL),当List Reverse( List L );这个函数接收的链表内容为A,B,C,D(为了简便我用字母,里面定义是整型,但思路一样适用),如下图:

第一步,用 L->Next  指向 Prev,  切断 L->Next 与B直接的联系,这样一来就变成了下面的样子。

(2).有了第一步,就可以想到第二部怎么做了,但还需要注意一些细节,我们需要修改Prev的指针指向的位置,还有指针L指向的位置,为的是下一步将 B 也连接到 A 指针的后面,如下图:

此时将L重新指向原来的链表的第一个位置,但原来的链表少了一个A,此时就指向了B,让temp指向下C。用代码实现就是:

                                       Prev = L;

                                       L = Temp;

                                       Temp = L->Next;

 

因此reverse函数的代码就是

void reverse(Linklist &l){
    Linklist p=NULL,tem;
    while(l){
        tem=l->next;
        l->next = p;
        p = l;
        l=tem;
    }
    l = p;

}

但可能由于链表赋值是用的方法不同 ,所以最后我的链表逆转后有问题,全部代码:

void tail(Linklist &L){
   L= (Linklist)malloc(sizeof(list));
   Linklist end,p;
   L->next = NULL;
   end= L;
   int i,n;
   printf("Input the LNode number:");
   scanf("%d",&n);
            //如果
   for(i=0;i<n;i++){
    p = (Linklist)malloc(sizeof(list));
    scanf("%d",&p->data);
    end->next = p;
    end = p;
   }
   end->next = NULL;

}

void print(Linklist l){
   Linklist tem;
   tem = l;
   while(tem->next!=NULL){
     tem= tem->next;
     printf("%d\n",tem->data);
     }
}

void reverse(Linklist &l){
    Linklist t=l,p=NULL,tem;
    while(l){
        tem=l->next;
        l->next = p;
        p = l;
        l=tem;
    }          //逆转之后的链表没有带头结点
t->next=p;
l=t; } main(){ Linklist L
=NULL; tail(L); print(L); reverse(L); printf("逆转后链表中的数为:\n"); print(L); }

 

 

逆转K个数的方法

Linklist reverse(Linklist head,int K){

  int cnt = 1;    Linklist new,old,tmp;

  new=head->next;   old = new->next;

   while(cnt<K){

    tmp= old ->next;    new=old;  old = tmp;   cnt++;

}   

       head->next->next = old;

return  new;

    }

 

转载于:https://www.cnblogs.com/xiaoqiz/p/10580976.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值