Reverse a linked list from position m to n.
- 翻转的是链表的其中一部分
- 首先要知道m前一个node在哪儿
- 从这后面开始一步步翻转,翻转到n停止
- 关键是记录m_prev,n_node, n_prev的位置,因为最后一步要将翻转的链表连接起来
- 注意,m可能为1,头结点可能被翻转,所以头前加dummy node,便利翻转。
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
ListNode * reverseBetween(ListNode * head, int m, int n) {
ListNode *m_prev, *m_node, *n_node, *n_next;
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy, *crt = head;
for (int i = 1; i < m; i++) {
prev = crt;
crt = crt->next;
}
m_prev = prev;
m_node = crt;
prev = NULL;
for (int i = m; i <= n; i++) {
ListNode *temp = crt->next;
crt->next = prev;
prev = crt;
crt = temp;
}
n_next = crt;
n_node = prev;
m_prev->next = n_node;
m_node->next = n_next;
return dummy->next;
}
};