LeetCode 92 反转链表②

地址:https://leetcode-cn.com/problems/reverse-linked-list-ii/
大意:给定一个链表,翻转其中的一部分

解答:

//非递归
/**
 * 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) {
        ListNode *hh = new ListNode(0);
        hh->next = head;
        ListNode *newNode = hh;
        ListNode *ordNode = head;
        for(int i = 1 ; i <= n ; i ++ ){
            if(i < m)
                newNode = newNode->next;
            ordNode = ordNode->next;
        }
        /*三个节点,一个是待处理的节点,一个要指向的节点,一个是next节点*/
        ListNode *upNode = ordNode;
        ListNode *isNode = newNode->next;
        while(isNode != ordNode){
            ListNode *neNode = isNode->next;
            isNode->next = upNode;
            upNode = isNode;
            isNode = neNode;
        }
        newNode->next = upNode;
        return hh->next;
    }
};
//递归
/**
 * 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) {
        ListNode *hh = new ListNode(0);
        hh->next = head;
        ListNode *newNode = hh;
        ListNode *ordNode = head;
        for(int i = 1 ; i <= n ; i ++ ){
            if(i < m)
                newNode = newNode->next;
            ordNode = ordNode->next;
        }
        newNode->next = reverse(n,m,newNode->next,ordNode);
        return hh->next;
    }
    ListNode* reverse(int n,int i,ListNode *node,ListNode *neNode){
        if(i == n)
            return node;
        
        ListNode *newNode = reverse(n,i+1,node->next,neNode);
        node->next->next = node;
        node->next = neNode;
        return newNode;
    }
};
posted @ 2020-04-11 20:14  一只小白的进修路  阅读(117)  评论(0)    收藏  举报