Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

206. Reverse Linked List的拓展,这里只是反向一个链表中的一部分。先建立一个新list node: dummy,用dummy链接m之前不用反向的node,然后反向m~n的节点,最后在把反向的连接起来。

Java:

/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (m >= n || head == null) {
return head;
} ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy; for (int i = 1; i < m; i++) {
if (head == null) {
return null;
}
head = head.next;
} ListNode premNode = head;
ListNode mNode = head.next;
ListNode nNode = mNode, postnNode = mNode.next;
for (int i = m; i < n; i++) {
if (postnNode == null) {
return null;
}
ListNode temp = postnNode.next;
postnNode.next = nNode;
nNode = postnNode;
postnNode = temp;
}
mNode.next = postnNode;
premNode.next = nNode; return dummy.next;
}
}

Python:

class Solution:
def reverse(self, head):
prev = None
while head != None:
next = head.next
head.next = prev
prev = head
head = next
return prev def findkth(self, head, k):
for i in xrange(k):
if head is None:
return None
head = head.next
return head def reverseBetween(self, head, m, n):
dummy = ListNode(-1, head)
mth_prev = self.findkth(dummy, m - 1)
mth = mth_prev.next
nth = self.findkth(dummy, n)
nth_next = nth.next
nth.next = None self.reverse(mth)
mth_prev.next = nth
mth.next = nth_next
return dummy.next

Python:

class Solution:
def reverseBetween(self, head, m, n):
dummyNode = ListNode(0)
p = dummyNode
q = head for x in range(m - 1):
p.next = q
q = q.next
p = p.next start = None
end = q
next = None
for x in range(m, n + 1):
next = q.next
q.next = start
start = q
q = next p.next = start
end.next = next
return dummyNode.next

C++:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode dummy{0};
dummy.next = head; auto *prev = &dummy; for (int i = 0; i < m - 1; ++i) {
prev = prev->next;
} auto *head2 = prev; prev = prev->next;
auto *cur = prev->next; for (int i = m; i < n; ++i) {
prev->next = cur->next; // Remove cur from the list.
cur->next = head2->next; // Add cur to the head.
head2->next = cur; // Add cur to the head.
cur = prev->next; // Get next cur.
} return dummy.next;
}
};

  

  

类似题目:

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

All LeetCode Questions List 题目汇总

[LeetCode] 92. Reverse Linked List II 反向链表II的更多相关文章

  1. [LeetCode] 92. Reverse Linked List II_Medium tag: Linked List

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  2. [LeetCode] 92. Reverse Linked List II 倒置链表之二

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  3. LeetCode 92. Reverse Linked List II倒置链表2 C++

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  4. [leetcode]92. Reverse Linked List II反转链表2

    Reverse a linked list from position m to n. Do it in one-pass. Note: 1 ≤ m ≤ n ≤ length of list. Exa ...

  5. [LeetCode 92] Reverse Linked List II 翻转单链表II

    对于链表的问题,根据以往的经验一般都是要建一个dummy node,连上原链表的头结点,这样的话就算头结点变动了,我们还可以通过dummy->next来获得新链表的头结点.这道题的要求是只通过一 ...

  6. [LeetCode]92. Reverse Linked List II反转部分链表

    /* 重点还是反转链表 思路就是中间的反转,然后两头接上 */ public ListNode reverseBetween(ListNode head, int m, int n) { if (he ...

  7. leetcode 92 Reverse Linked List II ----- java

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  8. Leetcode#92 Reverse Linked List II

    原题地址 第一步,找到将要翻转的位置,记录翻转部分前一个节点(prev) 第二步,翻转,记录翻转完成后这部分的首(reverseHead)和尾(reverseTail),以及翻转部分之后的一个节点(p ...

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

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

随机推荐

  1. ThinkPHP模板之一

    这个东东,就得多练多写,无它法. 1,Application\Home\Controller\IndexController.class.php <?php namespace Home\Con ...

  2. 移动架构师第一站UML建模

    回想一下自己的Android生涯已经经历过N多个年头了,基本都是在编写业务代码,都知道35岁程序员是一个坎,当然如果有能力能做到Android架构师的职位其生命周期也会较长,毕境不是人人都能轻易做到这 ...

  3. IIS 使用 web.config 实现从 http 自动301跳转到 https 的方法

    现在很多网站为了安全,开启了 SSL 连接,那么开启 SSL 连接之后,如何将对应的 http 访问自动跳转到 https 上呢?之前介绍了 IIS 用 web.config 做域名的301跳转的方法 ...

  4. git下载带有子项目的项目

    我用的win  系统 bash命令 git clone --recursive xxxx.git

  5. LeetCode 1046. Last Stone Weight

    原题链接在这里:https://leetcode.com/problems/last-stone-weight/ 题目: We have a collection of rocks, each roc ...

  6. etcd增删改查

    ![image-20191209191301618](C:\Users\AneroKissinger\AppData\Roaming\Typora\typora-user-images\image-2 ...

  7. VSFTPD匿名用户上传文件

    1.安装vsftpd yum -y install vsftpd yum -y install ftp 客户端 2.编写配置文件 vim /etc/vsftpd/vsftpd.conf anonymo ...

  8. MySQL 分库分表 dble简单使用

    一.运行环境 Host Name IP DB Mod data0 172.16.100.170 mysql   data1 172.16.100.171 mysql   data2 172.16.10 ...

  9. BZOJ 4212: 神牛的养成计划 可持久化trie+trie

    思路倒是不难,但是这题卡常啊 ~ code: #include <bits/stdc++.h> #define N 2000004 #define M 1000005 #define SI ...

  10. 每个开发人员必须知道PDB文件知识

    大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已.如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的.虽然编写 ...