c_cpp 92.反向链接清单II - 中 - 2018.7.31

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 92.反向链接清单II - 中 - 2018.7.31相关的知识,希望对你有一定的参考价值。

/**
1:寻找真正要逆向部分的链表,找寻起点和终点,断开 m & n 对应节点与链表的连接
2:对需要逆向的那部分链表进行处理
3:重新将完成逆向的部分连接到链表里
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head) return NULL;
        ListNode *preNode = NULL;
        ListNode *nextNode;
        while (head->next != NULL) {
            nextNode = head->next; 
            head->next = preNode;
            preNode = head;
            head = nextNode;
        }
        head->next = preNode;
        return head;
    }

    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if (!head || m == n) return head;
        ListNode *startReverseNode = head;
        ListNode *startReversePreNode = NULL;
        for (int i = 1; i < m; i++) {
            if (i == m-1) startReversePreNode = startReverseNode;
            startReverseNode = startReverseNode->next;
        }
        ListNode *anchorNode = startReverseNode;
        for (int i = m; i < n; i++) {
            anchorNode = anchorNode->next;
        }
        if (anchorNode->next != NULL) {
            ListNode *tempNode = anchorNode->next;
            anchorNode->next = NULL;
            anchorNode = tempNode;
        } else {
            anchorNode = NULL;
        }
        ListNode *newStartNode = reverseList(startReverseNode);
        startReverseNode->next = anchorNode;
        if (startReversePreNode == NULL) {
            return newStartNode;
        }
        startReversePreNode->next = newStartNode;
        return head;
    }
};

以上是关于c_cpp 92.反向链接清单II - 中 - 2018.7.31的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 206.反向链接清单 - 简单 - 2018.7.31

c_cpp 142.关联清单周期II-中 - 2018.7.30

java 92.反向链表II(#)。java

java 92.反向链表II(#)。java

java 92.反向链表II(#)。java

java 92.反向链表II(#)。java