LeetCode 92 Reverse Linked List II

LeetCode 92

Reverse Linked List II

  • Problem Description:
    给出两个值m和n,将链表中从第m到n个结点部分进行翻转,其余结点不变。

    具体的题目信息:
    https://leetcode.com/problems/reverse-linked-list-ii/description/

  • Solution:

    • 解题思路
      本题用两个栈实现,临时栈temp存储需要进行翻转的结点的值,结果栈re存储按照原顺序的结点的值。有几种情况需要考虑,从头开始进行翻转和从中间开始进行翻转,一直翻转到结尾和翻转到链表中间。

    • 编程实现

/**
 * 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 == NULL)
            return head;
        if (head->next == NULL)
            return head;
        if (m == n)
            return head;
        stack<int> re; //输出栈
        stack<int> temp; //临时栈,存储进行翻转的值
        int count = 1;
        ListNode* p = head;
        while(p) {
        //若从头开始翻转则一开始就把链表的值push进栈temp
            if (m == 1&&count<= n) {
                temp.push(p->val);
                //需要判断是否整条链表都进行翻转,如果是,直接将temp栈中值push进输出栈re
                if (p->next == NULL) {
                    while(!temp.empty()) {
                        re.push(temp.top());
                        temp.pop();
                    }
                }
            } else if (count<m) {
            //若不是从头开始翻转,则把小于m的结点值push进结果栈
                re.push(p->val);
            } else if (count>= m&&count<= n) {
            //将需要进行翻转的值push进临时栈
                 temp.push(p->val);
                 //判断是否翻转到尾部,如果是,将临时栈中的值push进结果栈
                    if (p->next == NULL) {
                        while(!temp.empty()) {
                            re.push(temp.top());
                            temp.pop();
                        }
                    }
            } else {
            //若没有翻转到结尾,则遇到第一个不需要进行翻转的值时要先把临时栈中的值push进结果栈,再对剩余的结点进行处理
                if (count==n+1) {
                        while(!temp.empty()) {
                            re.push(temp.top());
                            temp.pop();
                        }
                    }
                    re.push(p->val);
            }
            count++;
            p = p->next;
        }
        ListNode* t = createList(re);
        return t;
    }
    //根据栈中的值使用头插法来建立链表
    ListNode* createList(stack<int> t) {
        ListNode* p = new ListNode(t.top());
        t.pop();
        p->next = NULL;
        ListNode* q;
        while(!t.empty()) {
            q = new ListNode(t.top());
            q->next = p;
            p = q;
            t.pop();
        }
        return q;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值