用queue+stack one-pass 实现
我发现链表之类的题目千万不要用循环+指针在循环里面试图构建链表,这样很容易出现指针问题
思路很简单也很直观,queue保证reverse之前的链表节点的顺序,stack负责reverse,而再后面的不用动接上去就完事儿了
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
stack<ListNode*>s;
queue<ListNode*>q_f;
queue<ListNode*>q_e;
ListNode *p = head;
int i = 1;
while (i < m) {
++i;
q_f.push(p);
p = p->next;
}
while (i <= n) {
++i;
s.push(p);
p = p->next;
}
ListNode *mark = new ListNode(0);
head = mark;
while (!q_f.empty()) {
q_f.front()->next = NULL;
head->next = q_f.front();
head = head->next;
q_f.pop();
}
while (!s.empty()) {
s.top()->next = NULL;
head->next = s.top();
head = head->next;
s.pop();
}
head->next = p;
return mark->next;
}
};