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

链表内指定区间反转

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

  1. 虽然和上一道题都有链表反转,但是用递归的思路很难做,用正向好处理一些,原因是整个链表反转不用考虑前后节点,末尾就是NULL,但是区间反转需要计数,如果是抵达某一个元素来确定区间,那感觉可以用递归的思路;
  2. 正向做就是注意指针迭代的先后顺序,不要把指针丢了,该写一个临时变量temp存储都可以大胆写;
  3. 注意这样写cur指针自己就向后移动了,不需要再跟随i++不断后移了;
  4. 这道题他反转的时候希望有一个不动量start,但是如果m=1那start就不得不是动量了,所以在前面加了一个"real_head"这个自己添加的节点绝对不会动,这样统一起来好写很多;
  5. 如果m=1,那么cur就在head指针处,虽然全程没有操作过head,但是head和cur是指向同一个地址,cur动了head跟着动,得注意head不再是一开始那个head了,用real_head这个绝对不会动的头部最稳妥。
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param m int整型 
 * @param n int整型 
 * @return ListNode类
 */
#include <stdio.h>
#include <stdlib.h>
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
    // write code here
    int i = 0;
    struct ListNode* real_head = (struct ListNode*)malloc(sizeof(struct ListNode));
    real_head->val = 0;
    real_head->next = head;

    struct ListNode* cur = real_head;
    struct ListNode* start = real_head;
    struct ListNode* temp = real_head->next;
    while(cur->next != NULL)
    {
        if(i < m)
        {
            start = cur;
            temp = start->next;
            cur = cur->next;
        }
        if(i >= m && i < n)
        {
            start->next = cur->next;
            cur->next = start->next->next;
            start->next->next = temp;
            temp = start->next;
        }
        if(i >= n)
        {
            break;
        }
        i++;
    }
    return real_head->next;
}

全部评论

相关推荐

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