题目:
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; } };