推荐大家去看这个:写的超级好
先说思路:
因为头节点plist与第一个数据节点相连,因此先给头节点plist与第一个数据节点断开来,让plist->next不断地赋值给p->next,直到出现p为空,这就代表p已经遍历到最后一位,然后一直进行头插法,以此类推,就可以将单链表逆置!
图解:
代码:
//单链表如何逆置 一直头插
void Reverse(PNode plist)
{
Node *p = plist->next;//在链表的表头之后依次插入各个结点
Node *q;
plist->next = NULL; //将头节点处断开
while(p != NULL)//这块的条件就是当p等于NULL的时候,p遍历到原来链表的最后一位
{
q = p->next; //p是第一个有效的数据节点
p->next = plist->next;
plist->next = p;
p = q;
}
}
还有一种方法是不利用头节点来进行逆置,利用三个指针 p q r 来进行逆置,思路一毛一样,直接就上代码了:
//逆置2 通过三个指针来颠倒 不借助头结点 //可以不掌握
void Reverse(PNode plist)
{
assert(plist!=NULL && plist->next!=NULL);//前面保证头结点存在,后面保证第一个有效节点存在
Node *p = plist->next;
Node *q = p->next;
Node *r;
p->next = NULL;
while(q != NULL)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
plist->next = p;
}