leetcode 206. Reverse Linked List(剑指offer16)、
无论是1,还是2,删除链表都需要3个节点,只是现在这种最新写法只把cur作为了判断循环的依据,并且下一个节点的生成放在循环内。
206. Reverse Linked List
之前在牛客上的写法:
错误代码:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL)
return NULL;
ListNode* p1 = pHead;
ListNode* p2 = pHead->next;
ListNode* p3 = pHead->next->next;
pHead->next = NULL;
while(p3 != NULL){
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
return p2;
}
};
此代码会报“段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起”
如果链表只有一个节点,那p2就是空指针,p3就是空指针的下一个指针,但空指针是没有next的
正确代码:
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL)
return NULL;
else if(pHead->next == NULL)
return pHead;
ListNode* p1 = pHead;
ListNode* p2 = pHead->next;
ListNode* p3 = pHead->next->next;
pHead->next = NULL;
while(p3 != NULL){
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
return p2;
}
};
个人觉得这种以当前节点为循环判断条件的方式比较好:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = NULL;
while(head){
ListNode* tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}
};
92. Reverse Linked List II
依旧要在循环开始前获得pre和cur指针。
有个边界条件是m = 1的时候,可能第一个节点,即head指针也要反转,所以返回的时候返回head会出错。所以申请了一个指针,并且下一个节点就是head,这样无论哪种情况,都是申请指针的下一个节点。
注意pre的初始化也是在head之前,因为m <= 1实际上都是在head之前。还要注意m-1的设置,并且这个for循环就是找pre的位置。
i=m;i < n 比如3个节点的reverse,实际上只用操作2次就好了。
思路上:每次把cur的下一个节点旋转到cur之前去,pre节点实际上是不变的。
错误写法:
错误在tmp->next = cur; 第一次循环是对的,后面的就错了。cur指针是不变的,但是pre和cur之间的个数在增加,真正要放的位置是pre后面
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* pre = new ListNode(-),*res = pre;
pre->next = head;
res = pre;
for(int i = ;i < m - ;i++)
pre = pre->next;
ListNode* cur = pre->next;
for(int i = m;i < n;i++){
ListNode* tmp = cur->next;
cur->next = tmp->next;
tmp->next = cur;
pre->next = tmp;
}
return res->next;
}
};
正确写法:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* pre = new ListNode(-),*res = pre;
pre->next = head;
res = pre;
for(int i = ;i < m - ;i++)
pre = pre->next;
ListNode* cur = pre->next;
for(int i = m;i < n;i++){
ListNode* tmp = cur->next;
cur->next = tmp->next;
tmp->next = pre->next;
pre->next = tmp;
}
return res->next;
}
};
leetcode 206. Reverse Linked List(剑指offer16)、的更多相关文章
- 迭代和递归 - leetcode 206. Reverse Linked List
Reverse Linked List,一道有趣的题目.给你一个链表,输出反向链表.因为我用的是JavaScript提交,所以链表的每个节点都是一个对象.例如1->2->3,就要得到3-& ...
- [LeetCode] 206. Reverse Linked List 反向链表
Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...
- [LeetCode] 206. Reverse Linked List ☆(反转链表)
Reverse Linked List 描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...
- C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解
面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...
- LeetCode 206. Reverse Linked List (倒转链表)
Reverse a singly linked list. 题目标签:Linked List 题目给了我们一个链表,要求我们倒转链表. 利用递归,新设一个newHead = null,每一轮 把下一个 ...
- Java for LeetCode 206 Reverse Linked List
Reverse a singly linked list. 解题思路: 用Stack实现,JAVA实现如下: public ListNode reverseList(ListNode head) { ...
- Java [Leetcode 206]Reverse Linked List
题目描述: Reverse a singly linked list. 解题思路: 使用递归或者迭代的方法. 代码如下: 方法一:递归 /** * Definition for singly-link ...
- LeetCode 206. Reverse Linked List倒置链表 C++
Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...
- LeetCode 206 Reverse Linked List 解题报告
题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...
随机推荐
- win10 关闭自动更新
方法一 : 利用组策略关闭win10自动更新的步骤如下:1.按win+R打开“运行”,输入“gpedit.msc”,按下回车. 2.找到“计算机配置”→““管理模板”→“Windows 组件”→“Wi ...
- HTML5仿微信公众号界面
jQuery连接: https://pan.baidu.com/s/1Qj948NPMDmcqzcMyKm8nMw 密码:vewr 图片连接: https://pan.baidu.com/s/1Fha ...
- 找不到指定的模块 c#
首先查这个模块是否存在 若存在,用depends工具查找依赖模块,看下依赖模块是否存在, 依赖模块可以和模块放到同一路径下
- (2)Jquery1.8.3快速入门_checkbox全选取消部分选中
1. jquery示例功能: checkbox多选框 全选 .全不选. 选择部分. 源码 : <!DOCTYPE html> <html> <head> <m ...
- java中int和Integer比较大小
Integer是int的封装对象,两个对象==比较的是栈的值 Integer a = new Integer(1); Integer b = new Integer(1); a与b存的是Integer ...
- objectLiteral.js
// 1.任意参数的加法运算 function add(){ var sum = 0 for(var i=0;i<arguments.length;i++){ if(!isNaN(argumen ...
- deepin使用笔记-解决安装并解决gvim没有启动器的问题
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装gvim #apt-get install vim-gtk3 2.创建桌面启动器 创建/usr/share/applic ...
- CSS--居中方式总结
一.水平居中方法 1.行内元素.字体的水平居中 1.对于行内元素(display值为inline或inline-block都可以)或者字体:父元素添加css规则:text-align:center; ...
- SAP MM 并非奇怪现象之MB5B报表查不到某一笔出库记录?
物料号:1301002696 工厂代码:2160 MB5B,如下查询条件, 查询结果中,期初与期末库存数量都是0,期间的出库入库数量都是0.事实上该物料期初应该是有库存的.并且我用MB51相同时间段查 ...
- Gartner2017年BI研究计划曝光,来看看他研究的都是啥?
文 | 水手哥 本文出自:知乎专栏<帆软数据应用研究院>——数据干货&资讯集中地 近日,Gartner发布了<Analytics and Business Intelli ...