翻转链表中第m个节点到第n个节点的部分
样例
例1:
输入: 1->2->3->4->5->NULL, m = 2 and n = 4,
输出: 1->4->3->2->5->NULL.
例2:
输入: 1->2->3->4->NULL, m = 2 and n = 3,
输出: 1->3->2->4->NULL.
挑战
Reverse it in-place and in one-pass
注意事项
m,n满足1 ≤ m ≤ n ≤ 链表长度
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
ListNode * reverseBetween(ListNode * head, int m, int n) {
// write your code here
if(m==n) return head;
int cnt=1;
ListNode *p=head;
while(p&&cnt!=m){ p=p->next;cnt++;}
stack<int> s;
ListNode *rev=new ListNode(0);
ListNode *q=rev;
while(cnt<=n)
{
s.push(p->val);
cnt++;
p=p->next;
}
while(!s.empty())
{
ListNode*node=new ListNode(s.top());
s.pop();
q->next=node;
q=q->next;
}
q->next=p;
p=head;
cnt=1;
if(cnt==m)
{
return rev->next;
}
while(p&&cnt!=m-1) {p=p->next;cnt++;}
p->next=rev->next;
return head;
}
};