无论是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)、的更多相关文章

  1. 迭代和递归 - leetcode 206. Reverse Linked List

    Reverse Linked List,一道有趣的题目.给你一个链表,输出反向链表.因为我用的是JavaScript提交,所以链表的每个节点都是一个对象.例如1->2->3,就要得到3-& ...

  2. [LeetCode] 206. Reverse Linked List 反向链表

    Reverse a singly linked list. Hint: A linked list can be reversed either iteratively or recursively. ...

  3. [LeetCode] 206. Reverse Linked List ☆(反转链表)

    Reverse Linked List 描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL    输出: 5->4->3-> ...

  4. C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解

    面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...

  5. LeetCode 206. Reverse Linked List (倒转链表)

    Reverse a singly linked list. 题目标签:Linked List 题目给了我们一个链表,要求我们倒转链表. 利用递归,新设一个newHead = null,每一轮 把下一个 ...

  6. Java for LeetCode 206 Reverse Linked List

    Reverse a singly linked list. 解题思路: 用Stack实现,JAVA实现如下: public ListNode reverseList(ListNode head) { ...

  7. Java [Leetcode 206]Reverse Linked List

    题目描述: Reverse a singly linked list. 解题思路: 使用递归或者迭代的方法. 代码如下: 方法一:递归 /** * Definition for singly-link ...

  8. LeetCode 206. Reverse Linked List倒置链表 C++

    Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5->4-> ...

  9. LeetCode 206 Reverse Linked List 解题报告

    题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...

随机推荐

  1. Java基础——Oracle(一)

    Oracle是目前最流行的数据库之一.功能强大,性能卓越.所以学起来比较困难.学习Oracle需要具备一定的基础.比如学习过一门编程语言,或者学过其他的数据库等,没有一些基础很难下手. 一.Oracl ...

  2. XML 和 JSON

    1. XML介绍 必须要有节点:根节点必须且只有一个,用户节点可以自定义. 2. JSON介绍: 3.生成json方法 json_encode() 4.xml生成字符串方法有几种 拼装字符串,或者ph ...

  3. Linux 学习笔记之超详细基础linux命令 Part 1

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122   说明:主要是在REHL Server 6操作系统下进行的测试 --字符界面虚拟终端与图形界面之间的切 方法:[ ...

  4. 排错-lr回放错误Vuser failed to initialize extensi...解决方法

    lr回放错误:Vuser failed to initialize extension LrXml.dll解决方法   by:授客 QQ:1033553122 步骤1:找到LR安装位置,打开协议目录 ...

  5. .NET中资源文件的使用

    工作需要,为VB.NET WinForm程序提供一个中英文界面切换功能,大方向有三个ini.XML.资源文件. 首先ini太过时,坚决不打算用.资源文件和XML相比提供了一个资源文件管理器,编写键值对 ...

  6. plt 数据可视化

    1.plt.plot(x,y,color) 折线坐标图 import matplotlib.pyplot as plt h = np.linspace(1, 10, 10) v = np.linspa ...

  7. python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object): ""&q ...

  8. 【PAT】B1068 万绿丛中一点红(20 分)

    一开始因为看见这题就头疼,可费了点时间. 要考虑所有元素,如果忽略外圈元素,最后一个样例过不去. 而且要求只出现一次的元素, 我没有使用map,因为当时还没学,用map储存元素会节约好多代码 #inc ...

  9. PJ可能会用到的动态规划选讲-学习笔记

    PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...

  10. WEB应用打成jar包全记录

    内容属原创,转载请注明出处 题外 由于项目的需求—不管是怎么产生的这个需求—总之,需要支持把一个web应用打成jar包供其他应用使用,这就有了下面的过程. 这个过程里用到了Spring和SpringM ...