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