反转链表
- 描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)