单链表的逆置
单链表的逆置:

方法一:向后转,第一个点变为最后一个,时间复杂度O(n)
(1):将第一个点置空

(2):再创建一个指针s指向还未处理的结点的第一个

(3)再p赋值为q,q赋值为s,s赋值为q->next,再把p的值赋值给p->next,一直走下去,q==NULL,plist->next=p;结束


代码实现:
void Reverse2(List plist)
{
if (plist==NULL||plist->next==NULL||plist->next->next==NULL)
{
return;
}
Node *p = plist->next;
Node *q = p->next;
Node *s;
p->next = NULL;//一定要置空
while (q!=NULL)
{
s = q->next;
q->next = p;
p = q;
q = s;
}
plist->next = p;
}
方法二:利用头插的思想,把所有的结点断开,再利用头插方式把所有的结点重新插一次
(1)把plist置空,成为新的链

(2)把p头插到这条新链中,新的链与后面无关 p->next = plist->next;plist->next = p;p->q;q再指向下一个点


(3)再把p头插,重复头插

代码实现:
void Reverse(List plist)//逆置
{
if (plist==NULL||plist->next==NULL||plist->next->next==NULL)
{
return ;
}
Node *p = plist->next;
plist->next = NULL;
Node *q;
while (p!=NULL)
{
q = p->next;
p->next = plist->next;
plist->next = p;
p = q;
}
}
本文详细介绍了两种单链表逆置的方法:向后转和头插思想。向后转方法通过改变节点指针方向,使首节点变为尾节点,时间复杂度O(n)。头插思想则是将所有节点断开,再重新插入新链表头部。文章提供了具体步骤和代码实现。
1568

被折叠的 条评论
为什么被折叠?



