反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
昨天做的忘记发博文了,注意一个异常情况,
反转的时候需要自己建一个头结点的。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
int len = right - left;
if (len <= 0) {
return head;
}
//建一个头节点(防止没有头节点的情况)
ListNode *trueHead = new ListNode(0);
trueHead->next = head;
//用于探测到front节点的位置
int numGetStart = left - 1;
int numGetEnd = right - left + 1;
ListNode *frontNode = trueHead;
while (numGetStart--) {
frontNode = frontNode->next;
}
ListNode *backNode = frontNode;
while (numGetEnd--) {
backNode = backNode->next;
}
//cout << "frontNode val:" << frontNode->val << endl;
//cout << "backNode val:" << backNode->val << endl;
ListNode *reverNode = reverseNode(frontNode->next, backNode->next, len);
frontNode->next = reverNode;
return trueHead->next;
}
public:
/*
* 此时的start为起始节点开始翻转,end节点为head的下一个节点
*/
ListNode * reverseNode(ListNode *start,ListNode*end, int len) {
ListNode *p1 = start;
ListNode *p2 = p1->next;
ListNode *p3 = nullptr;
while (p2!= nullptr && len > 0) {
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
len--;
}
//head->next need set to the backNode
start->next = end;
return p1;
}
};
int main() {
Solution *ps = new Solution();
ListNode *head = new ListNode(3);
ListNode *temp = new ListNode(5);
head->next = temp;
//ListNode *temp = head;
//for (int i = 1; i < 10; i++) {
// ListNode *node = new ListNode(i);
// temp->next = node;
// temp = node;
//}
head = ps->reverseBetween(head, 1, 2);
while (head != nullptr) {
cout << "val:" << head->val << endl;
head = head->next;
}
system("pause");
return 0;
}