题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

这个题很简单,思考起来:

/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */
class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        ListNode* hHead = new ListNode(-1);
        hHead->next = head;

        ListNode* preHead = hHead;
        ListNode* nowHead = head;
        for(int i = 1; i < m ;i++ ){
            preHead = nowHead;
            nowHead = nowHead->next;
        }
    /** 很关键的一步 **/
        for( int i = m ; i < n ; i++){
            ListNode* temNode = nowHead->next; @1
            nowHead->next = temNode->next;     @2
            temNode->next = preHead->next;     @3
            preHead->next = temNode;           @4
        }
        return hHead->next;
    }
};

关键步骤:
在这里,就这个题而论,思考这个循环,关键的是记住,preHead,nowHead位置都没有变。
这里就循环了两次

第一次循环,链表变成了1->3->2->4->5->null
详细过程:preHead:1 nowHead:2
@1:将2的下一个指向的数字3的地址赋给临时节点temNode
@2:将3的下一个指向的数字4的地址赋给nowHead的next指针,也就是将2指向4
@3:将1的下一个指向的数字2的地址赋给temNode的next指针,也就是将3指向2
@4:将preHead的next指针指向3,也就是1指向3

第二次循环,链表变成了1->4->3->2->5->null
详细过程:preHead:1 nowHead:2
@1:将2的下一个指向的数字4的地址赋给临时节点temNode
@2:将4的下一个指向的数字5的地址赋给nowHead的next指针,也就是将2指向5
@3:将1的下一个指向的数字3的地址赋给temNode的next指针,也就是将4指向3
@4:将preHead的next指针指向3,也就是1指向4

#在找工作求抱抱#
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务