为什么感觉明明把两个链表链接起来了,但是实际上没有
作者:互联网
将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)
1 /*将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)*/ 2 void attach(List *L1, List *L2) 3 { 4 List p; 5 6 /*寻找L1链表的尾节点的next指针*/ 7 for (p = *L1; p; p = p->next); //当指针p不为空时,p不断后移 8 9 /*退出循环代表p为空,即p和尾节点的next指针同指向*/ 10 p = *L2; //修改p,使p指向L2链表 11 12 13 }
上面这个函数看似把L1的尾部链接了L2的头部,但是实际上并没有。因为用于链接的指针p并不属于L1,只是一个和L1尾节点的next同指向的指针,
是尾节点的next指针的拷贝,所以修改它的值并不会对L1有任何影响,所以当然没有将两个链表链接在一起。
正确的做法是:将p->next作为for()循环的判断条件,最终退出循环时p->next为空,修改p->next的指向,p->next = *L2;
这样就能将两个链表成功链接在一起了,因为虽然p指针依然只是L1链表的尾节点指针的一个拷贝,p依然不属于L1链表,
但是p->next却是属于链表的,所以修改p->next的指向就能真正对L1链表产生影响,从而真正将L2连接到L1的尾部。
函数代码修正如下:
1 /*将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)*/ 2 void attach(List *L1, List *L2) 3 { 4 List p; 5 6 /*寻找L1链表的尾节点的next指针*/ 7 for (p = *L1; p->next; p = p->next); //当指针p->next不为空时,p不断后移 8 9 /*退出循环代表p为空,即p和尾节点的next指针同指向*/ 10 p->next = *L2; //修改p,使p->next指向L2链表 11 12 }
标签:明明,List,next,链表,L2,L1,链接,指针 来源: https://blog.51cto.com/u_14201949/2832070