<LeetCode> 题35:翻转链表1(翻转整个链表)
2016-07-26 14:08
393 查看
1. 题目描述:
翻转一个链表,例如:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null。2. 链表数据结构
/** * struct ListNode * { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; **/
3. 代码
3.1 思路1:借助栈来实现
先扫描一遍链表保存每个节点的值,然后再从头到尾遍历,将栈中元素值一一赋给链表节点。时空复杂度都是O(n)。class Solution { public: ListNode *reverse(ListNode *head) { if(head == NULL) { return NULL; } stack<int> stk; ListNode *cur = head; while(cur != NULL) { stk.push(cur->val); cur = cur->next; } cur = head; while(cur != NULL) { cur->val = stk.top(); cur = cur->next; stk.pop(); } return head; } };
3.2 思路2:迭代
依次将从第二个结点到最后一个结点的后继设为头结点,然后将该节点设为头结点(需记住将原头结点的后继设为空)。定义三个指针:p1,p2,p3,p1指向第1个结点;p2指向第2个结点,p3指向p2的下一个结点;然后将p1->next置为NULL(因为反转后,原先的第一个结点就是最后一个结点);接着将p2->next指向p1,p1和p2分别向后移动即可。
class Solution { public: ListNode *reverse(ListNode *head) { if(head == NULL) { return NULL; } ListNode *p1 = head; ListNode *p2 = head->next; ListNode *p3; p1->next = NULL;//反转后原来的第一个结点就是最后一个结点 while(p2 != NULL) { p3 = p2->next; p2->next = p1; //p1,p2交替工作进行反向 p1 = p2; p2 = p3; } head = p1; //反转后的第一个结点就是原来的最后一个结点 return head; } };
3.3 思路3:递归
首先反转从第二个结点到最后一个结点的链表,然后再将头结点放到已反转链表的最后,函数返回新链表的头结点。class Solution { public: ListNode* reverse(ListNode* head) { //此处的条件不能写成if(head == NULL) if (head == NULL || head->next == NULL) return head; ListNode *newhead = reverse(head->next); head->next->next = head; head->next = NULL; return newhead; } };
相关文章推荐
- day07_subprocess模块学习
- spring boot 使用spring AOP实现拦截器
- Spark 官方文档(3)——Standalone 模式
- ImportError: No module named apt_pkg
- Loading.LockPersistenManager 加载资源卡顿
- Android坐标getLeft,getRight,getTop,getBottom,getLocationInWindow和getLocationOnScreen
- 【优质】React的学习资源
- [转]你真的了解setTimeout和setInterval吗?
- WebLogic入门
- 判断手机系统类型以及判断是否在微信环境
- 适配器模式
- PHP获取当期前运行文件的路径,名字,服务器路径
- I,P,B帧和PTS,DTS的关系,GOP相关
- Shell脚本学习心得
- jquery中attr和prop的区别
- 传智播客:俩小时助你解决网站排名!
- 设计模式6大原则
- 使用Spring JDBCTemplate简化JDBC的操作
- 杭电-4006 The kth great number(优先队列)
- Xcode检测解决iOS内存泄露