Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL
将链表中m~n位置的结点反向。
思路1:
首先找到m结点和n结点,然后将m结点依次移到n结点的后面,m结点还指向原来的位置,n结点会前移,直到n结点与m结点相遇,就完成反向了。
注意:1.用一个dummy结点记住头结点;2.找到m的前驱结点pre以便于将m归位。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (head == NULL || head->next == NULL)
return head;
ListNode dummy(0);
dummy.next = head;//记住头结点
ListNode *preM = &dummy;
ListNode *mNode = head;
ListNode *nNode = head;
for (int i = 1; i < m; i++)
{
preM = mNode;
mNode = mNode->next;
}
for (int i = 1; i < n; i++)
{
nNode = nNode->next;
}
while (mNode != nNode)
{
preM->next = mNode->next;
mNode->next = nNode->next;
nNode->next = mNode;
mNode = preM->next;
}
return dummy.next;
}
};
思路2:
找到m结点及其前驱结点pre,依次将m+1~n的结点与m结点互换位置,需要pre来找到m的位置。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (head == NULL || head->next == NULL)
return head;
ListNode dummy(0);
dummy.next = head;//记住头结点
ListNode *pre = &dummy;
ListNode *cur = dummy.next;
for (int i = 1; i < m; i++)
{
pre = cur;
cur = cur->next;
}
for (int i = m; i < n; i++)
{
ListNode *temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
return dummy.next;
}
};