题目:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
链表定义如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
题意解析:一个对链表的操作,要求我们把位置m到n的元素进行转置,其实就是遍历链表,从结点m开始,将后结点变为自己的前结点的操作,一直到结点n结束。
一种c++的实现如下:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(m == n) return head;
ListNode* start = head;
ListNode* last;
ListNode* node_m;
ListNode* end;
ListNode* node_n;
ListNode* temp;
ListNode* newlist;
//cout<<"success"<<endl;
for(int i = 1; i <= n; i++) {
if(i == m-1) {
last = start;
}
if(i == m) {
node_m = new ListNode(start->val);
//cout<<node_m->val<<"node_m"<<endl;
}
if(i > m && i < n) {
temp = new ListNode(start->val);
if(i == m+1) {
newlist = temp;
newlist->next = node_m;
} else {
temp->next = newlist;
newlist = temp;
}
}
if(i == n) {
node_n = new ListNode(start->val);
if(start->next != NULL) {
end = start->next;
node_m->next = end;
}
if(m+1 != n)
node_n->next = newlist;
else
node_n->next = node_m;
if(m != 1)
last->next = node_n;
else
head = node_n;
break;
}
start = start->next;
}
return head;
}
};