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->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n 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 反向链表