单链表的逆转

关于点链表的逆转,主要在于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;

    }

 

posted @ 2019-03-22 21:09  小七啊  阅读(1075)  评论(0编辑  收藏  举报