随笔 - 112  文章 - 0  评论 - 0  阅读 - 1312

反转链表

  • 描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
 
数据范围: 0n1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
 
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
 
  • 示例1
输入:{1,2,3}
返回值:{3,2,1}
 
  • 示例2
输入:{}
返回值:{}
说明:空链表则输出空  
 
  • 解法1
算法思想:采用链表的头插法来实现链表的逆置
 
  • 解法2
算法思想:使用四个指针来进行链表的逆置,具体实现如代码注释。
 
 
  • 代码 
复制代码
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 #include <cstdlib>
10 class Solution {
11 public:
12     ListNode* ReverseList(ListNode* pHead) {
13                 //解法一
14         //添加头结点
15         ListNode* p=(ListNode*)malloc(sizeof(ListNode));
16         p->next=nullptr;
17         //头插法
18         ListNode *q=pHead;
19         ListNode *r=q->next;
20         while(q){
21             r=q->next;//暂存q的下一节点
22             q->next=p->next;
23             p->next=q;
24             q=r;
25         }
26         return p->next;
27         //解法二
28         // //特殊情况判断
29         // if(pHead==nullptr) return pHead;
30         // //如例题,p,q记录节点1,2位置,r,s记录节点2,3位置
31         // ListNode *p=pHead;
32         // ListNode *q=p->next;
33         // ListNode *r=q;
34         // ListNode *s=r->next;
35         // pHead->next=nullptr;//头结点的next置空
36         // while(q){
37         //     //为节点2,3的反转做准备
38         //     r=q;
39         //     s=r->next;
40         //     //节点1,2反转
41         //     q->next=p;
42         //     //p,q又成为节点2,3的位置
43         //     p=r;
44         //     q=s;
45         // }
46         // return p;//最终p指向最后一个节点,q指向空
47     }
48 };
复制代码

 

 

 
 
posted on   _月生  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示