试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为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)
一个工作指针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
![![[Pasted image 20241102202627.png]]](https://i-blog.csdnimg.cn/direct/2037f522396b4c6b9b2993dd12a2bfb8.png)
prev指向cur,cur指向next,next指向next的next
![![[Pasted image 20241102202731.png]]](https://i-blog.csdnimg.cn/direct/9255170fc7c343e2997c5655821eac67.png)
cur的next指向prev
![![[Pasted image 20241102202824.png]]](https://i-blog.csdnimg.cn/direct/290f81e26ce5420887238da860ab4232.png)
直到next指向NULL
![![[Pasted image 20241102202924.png]]](https://i-blog.csdnimg.cn/direct/fbc712d8f85140688e7072e201393315.png)
![![[Pasted image 20241102203014.png]]](https://i-blog.csdnimg.cn/direct/2d91e7eac1fb4a46b01de36c5b952bd6.png)
最后将L的next指向cur节点,也就是原来的尾节点
![![[Pasted image 20241102203056.png]]](https://i-blog.csdnimg.cn/direct/8b53d285841d4b68b80c8dc53e00c9e3.png)
完成逆置
一个工作指针cur用来遍历链表,一个后继指针用来保存cur的下一个节点,一个前驱指针prev用来保存前一个节点
cur指向L的next,从第一个节点开始
将当前遍历的节点的next指向NULL
开始遍历:
将prev指向cur,cur指向next,next指向next的下一个,三个指针往后走一步
将cur的next指向perv,将中间节点的next指向前一个节点
直到第三个节点指向NULL,也就是最后一个节点的next指向倒数第二个节点
最后将L的next指向cur,也就是哨兵位头节点指向最后一个节点,完成逆置
返回链表L
设将n个整数存放到不带头结点的单链表L中,将L中保存的序列循环右移k个位置。例如,若k=1,则将链表{0,1,2,3}变为{3,0,1,2}。
算法思想
将n初始化为1,cur指向L,cur的next指向第一个节点,往后遍历直到cur的next指向NULL,cur指向最后一个节点
![![[Pasted image 20241103143517.png]]](https://i-blog.csdnimg.cn/direct/eb5c036a597542ffaa1bf7dba2b3589b.png)
![![[Pasted image 20241103143537.png]]](https://i-blog.csdnimg.cn/direct/33d32fadd77f448f9df7024d197def90.png)
![![[Pasted image 20241103143555.png]]](https://i-blog.csdnimg.cn/direct/8deca099bc3b4c4e9dc8fcff517b9353.png)
![![[Pasted image 20241103143624.png]]](https://i-blog.csdnimg.cn/direct/317f7c554d61441dad6afc1e7f8dfb95.png)
再下一次cur->next指向NULL,不进入循环
这样遍历出链表的节点个数
![![[Pasted image 20241103143740.png]]](https://i-blog.csdnimg.cn/direct/8c575ebb4a1a4a95b90635aac1aef96b.png)
将cur的next指向L
![![[Pasted image 20241103144736.png]]](https://i-blog.csdnimg.cn/direct/81da5540eb8c42ebaa0e76d9540fff59.png)
构成循环链表
若k=1,也就是要右移一个位置
新链表的尾节点也就是第n-k个节点,也就是第4-1=3个节点
从头遍历依次,找到第n-k个节点,用cur指针指向
![![[Pasted image 20241103144754.png]]](https://i-blog.csdnimg.cn/direct/b4b9387098384ebb8848279d36fba6c4.png)
令L指向新链表尾节点的下一个节点
![![[Pasted image 20241103144813.png]]](https://i-blog.csdnimg.cn/direct/695460dd9f9647b79b043dc9694c8890.png)
将cur的next指向NULL,断开环
![![[Pasted image 20241103144829.png]]](https://i-blog.csdnimg.cn/direct/0b0175e132554607920d6cc0af1e423d.png)
完成右移
与逆置单链表的不同之处:
- 初始化成循环链表而不是空链表
- 判断链表尾不用空指针而用是否是链表头指针
![![[Pasted image 20241103151328.png]]](https://i-blog.csdnimg.cn/direct/517afbf39d0c4459a7bed46a733debbb.png)
让L的next指向自己,循环链表的初始化
![![[Pasted image 20241103151354.png]]](https://i-blog.csdnimg.cn/direct/183733c203e64f5d86498d470a15e4b0.png)
用next指针指向cur的下一个节点
![![[Pasted image 20241103151503.png]]](https://i-blog.csdnimg.cn/direct/435424de8bd44ab6953ee105241292d0.png)
将cur的next指向L的next
![![[Pasted image 20241103151536.png]]](https://i-blog.csdnimg.cn/direct/18b228b20311475984242869bb946bcc.png)
L的next指向cur
![![[Pasted image 20241103151630.png]]](https://i-blog.csdnimg.cn/direct/a7add652845647a68ba73aa0b8beaa14.png)
cur指向next
![![[Pasted image 20241103151650.png]]](https://i-blog.csdnimg.cn/direct/01b69ceea41d40c78fae3fe6922c14bf.png)
![![[Pasted image 20241103151717.png]]](https://i-blog.csdnimg.cn/direct/3960a3c4b8d948c799e336d510642921.png)
![![[Pasted image 20241103151750.png]]](https://i-blog.csdnimg.cn/direct/2ed8ae80130d4d088d31368ca244b316.png)
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qkl-jc/76414.html