Reverse Linked List II--チェーンテーブルとポインタを鍛える問題
1801 ワード
タイトルリンク:https://oj.leetcode.com/problems/reverse-linked-list-ii/
#include
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++) // : next , temp_pre temp
{
ListNode *temp_next = temp -> next;
temp -> next = temp_pre;
temp_pre = temp;
temp = temp_next;
}
end -> next = temp; // m n+1
if(first) { //
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< val<";
res = res -> next;
}
else {
cout< val<