原地逆置
试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)。
思路1
将头节点摘下,然后从第一节点开始,依次插入到头节点后面,头插法建立单链表,直到最后一个节点为止
![![[Pasted image 20241102200949.png]]](https://i-blog.csdnimg.cn/direct/bbbcbc2f3e4b4517b422032785d502e2.png)
断开L和链表
![![[Pasted image 20241102201609.png]]](https://i-blog.csdnimg.cn/direct/3d6bc04682c64161adf106ccadabd50d.png)
将cur的next指向L的next
![![[Pasted image 20241102201650.png]]](https://i-blog.csdnimg.cn/direct/55beec06649b45c483a562f95a51c46e.png)
将L的next指向cur
![![[Pasted image 20241102201710.png]]](https://i-blog.csdnimg.cn/direct/05b37e5f900342c2821929c21afbb91d.png)
完成插入,将cur指向next,next指向cur的next
![![[Pasted image 20241102201756.png]]](https://i-blog.csdnimg.cn/direct/4648970385fc46f3ac51bb309476d8aa.png)
LinkList ReverseL(LinkList &L)
{
LNode* cur, *next;
cur = L->next;
L->next = NULL;
while (cur)
{
next = cur->next;
cur->next = L->next;
L->next = cur;
cur = next;
}
return L;
}
一个工作指针cur用来遍历链表,一个后继指针next用来保存cur的下一个节点
cur指向第一个节点,将哨兵位的next置为NULL,与后面的链表断开链接
cur往后遍历,直到cur指向NULL
将next指向cur的next,保存下一个节点
将cur的next指向哨兵位的next,将cur节点插入到哨兵节点之后
将L的next指向cur,将哨兵节点和当前节点进行链接
将cur指向next,继续往后遍历
最后返回链表L
思路2
用三个指针prev,cur,next来表示三个连续的节点
![![[Pasted image 20241102202556.png]]](https://i-blog.csdnimg.cn/direct/48ae5c9615b044d0a96e8abb37a04fa8.png)
处理第一个节点,cur的next指向NULL
链表原地逆置、轮转及循环链表逆置算法

最低0.47元/天 解锁文章
5776

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



