无论是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;
}
};

最新文章

  1. 对TabControl的简单优化
  2. 孙鑫MFC学习笔记20:Hook编程
  3. smarty中增加类似foreach的功能自动加载数据方法
  4. 09_platform-tools简介&amp;常见adb指令
  5. sql语句小练习二
  6. 二分图匹配(KM算法)n^3 分类: ACM TYPE 2014-10-01 21:46 98人阅读 评论(0) 收藏
  7. 2014年辛星完全解读Javascript第一节
  8. T-SQL语言基础
  9. Linux/CentOS下的CST和UTC时间的区别以及不一致的解决方法
  10. input编辑框编辑状态切换
  11. ueditor 文本编辑器
  12. JAVA实现二进制,十六进制输出
  13. PHP 数组处理
  14. Core官方DI剖析(1)--ServiceProvider类和ServiceCollection类
  15. MD 的常用语法格式
  16. Springboot+ActiveMQ(ActiveMQ消息持久化,保证JMS的可靠性,消费者幂等性)
  17. 解决代理池的问题AttributeError: &#39;int&#39; object has no attribute &#39;items&#39;
  18. STL之vector容器详解
  19. 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机或Docker容器性能数据
  20. javaweb项目静态资源被拦截的解决方法

热门文章

  1. Mongodb的基本语法
  2. TCP服务器/客户端代码示例
  3. JSON方式封装通信接口
  4. canvas-star1.html
  5. Centos 7.x 安装 Docker-ce
  6. 解决git did not exit cleanly (exit code 128)
  7. loadrunner&#160;脚本开发-文件下载
  8. Kotlin入门(11)江湖绝技之特殊函数
  9. [iOS] WSHorizontalPickerView 图片水平滚动封装
  10. tinypng upload一键压缩上传工具,告别人肉