题目链接:https://oj.leetcode.com/problems/reverse-linked-list-ii/
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(): val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if(head == NULL || m == n) return head;
int i;
ListNode *first = NULL;
ListNode *temp = head;
for(i = 0; i < m - 1; i++)
{
first = temp;
temp = temp -> next;
}
ListNode *end = temp;
ListNode *temp_pre = temp;
temp = temp -> next;
for(i = m + 1; i <= n; i++) //<span style="font-family: Arial, Helvetica, sans-serif;">主要步骤:将该节点的next指针指向前一个节点,然后temp_pre和temp都往前移</span>
{
ListNode *temp_next = temp -> next;
temp -> next = temp_pre;
temp_pre = temp;
temp = temp_next;
}
end -> next = temp; <span style="font-family: Arial, Helvetica, sans-serif;">//将原来的第m个节点与第n+1个节点连接</span>
if(first) { <span style="font-family: Arial, Helvetica, sans-serif;">//判断是否从一开始就反向</span>
first -> next = temp_pre;
}
else {
head = temp_pre;
}
return head;
}
};
int main() {
int len,m,n,t,i,j;
cin>>len;
ListNode *node = new ListNode[len+1], *head;
head = node;
for(i = 0; i < len;i++) {
cin>>t;
j = i;
node[i].val = t;
node[i].next = &node[++j];
}
cin>>m>>n;
Solution a;
ListNode *res = a.reverseBetween(head,m,n);
for(i = 0; i < len; i++) {
if(i != len - 1) {
cout<<res -> val<<"->";
res = res -> next;
}
else {
cout<<res -> val<<endl;
}
}
delete [] node;
system("PAUSE");
}