题目描述:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路:
1.先让cur指针走m-1步,走到要逆置的第一个节点,并且保存第一个逆置节点的前一个节点pre,此时pre就是cur的前一个节点
2.接着计算出要逆置节点的个数,并且把他们压入栈中,并且要保存最后一个压入栈的节点tmp,因为最后一个逆置的节点可能是返回链表的头节点,此时cur指向最后一个逆置的节点的下一个节点
3.之后将pre所指向的节点依此和栈中的节点连接上,之后再将pre和cur连接
4.判断m是否等于1吗,也就是判断头节点是否被改变,如果m==1,说明头节点改变,则返回tmp指针;否则,返回原本的头指针head。
/**
* 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) {
if (head == nullptr)
return head;
//用栈来保存要逆置的节点
std::stack<ListNode*>s;
ListNode* pre = head;
ListNode* cur = head;
int i = n - m + 1;//压入栈的节点数
int j = m;//要提前走的步数
while (--j)
{
pre = cur;
cur = cur->next;
}
ListNode* tmp=nullptr;//保存最后要逆置的节点
while (i--)
{
s.push(cur);
tmp=cur;
cur = cur->next;
}
//从栈中去取元素,然后连接
ListNode* node = nullptr;
while (!s.empty())
{
node = s.top();
pre->next = node;
pre = node;
s.pop();
}
//连接后面的节点
pre->next=cur;
//判断头节点是有没有改变
if(m==1)
head=tmp;
return head;
}
};