LeetCode---92. 反转链表 II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shanghx_123/article/details/86566352

题目描述:

反转从位置 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;
    }
};

猜你喜欢

转载自blog.csdn.net/shanghx_123/article/details/86566352