头插法逆置
请先看代码:
void Reverse(List plist)//逆置
{
assert(plist != NULL);
Node *p, *q;
p = plist->next;
plist->next = NULL;
while (p != NULL)
{
q = p;
p = p->next;
q->next = plist->next;
plist->next = q;
}
}
看代码可能看不懂,请跟着我的图走一遍
假设,111,666,333,444,888为五个节点的地址,其中头节点为111
第一步:p = plist->next;//让p指向666所在的地址
plist->next = NULL;是的111(plist)与后面断开
第二部:第一次循环
q = p;//定义p到q的位置
p = p->next;//把p挪到它指向的下一个位置
q->next = plist->next;//把q打断,让它变成一个孤立节点
plist->next = q;再把q这个单个节点接在plist上
这样就完成一次循环了,可能你还没看懂,但是请再看一个循环你就一定会明白;
第三步:第二次循环
q = p;//定义p到q的位置
p = p->next;//把p挪到它指向的下一个位置
q->next = plist->next;//让他指向p->list
plist->next = q;再把q这个单个节点接在plist上
整理:
这下你对比这张图和第一张图就发现前两个已经成功逆置(头节点不逆置)
这样多循环几次就可以完全逆置了。