反转链表 II
时间限制: 1S类别: DS:数组与链表->链表--较难
问题描述 :
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
![](https://img-blog.csdnimg.cn/img_convert/98d6fdc0a35ee71f209e79110bd116b4.jpeg)
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
提示:
链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
输入说明 :
输入链表长度n,然后输入n个整数,以空格分隔,然后输入两个整数left 和right
输出说明 :
输出格式见范例。
输入范例 :
5
1 2 3 4 5
2 4
输出范例 :
head-->1-->4-->3-->2-->5-->tail
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
struct ListNode
{
ListNode* next;
int val;
};
ListNode* reverseBetween(ListNode *head, int left, int right) {
if (head == NULL || left == right || left > right) {
return head;
}
ListNode *res = new ListNode;
res->next= head;
ListNode *pre = res;
ListNode *point = res->next;
for (int i = 1; i <= left; i++) {
pre = pre->next;
point = point->next;
}
for (int j = 1; j <= right - left; j++) {
// 反转left-right间节点
ListNode *node = point->next;
point->next = point->next->next;
node->next = pre->next;
pre->next = node;
}
return res->next;
}
ListNode* createByTail(int len)
{
ListNode* head = new ListNode;
ListNode* p, * temp;
p = head;
head->next = NULL;
int data, i;
for (i = 0; i < len; i = i + 1)
{
cin >> data;
temp = new ListNode;
temp->val = data;
p->next = temp;
p = temp;
}
p->next = NULL;
return head;
}
void output(ListNode* head)
{
ListNode* p1;
p1 = head;
p1 = p1->next;
cout << "head-->";
while (p1 != NULL)
{
cout << p1->val << "-->";
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
cout << "tail" << endl;
return;
}
int main()
{
ListNode* head1;
int a, b,len;
cin >> len;
head1 = createByTail(len);
cin >> a >> b;
head1 = reverseBetween(head1, a, b);
output(head1);
}