题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
- 虽然和上一道题都有链表反转,但是用递归的思路很难做,用正向好处理一些,原因是整个链表反转不用考虑前后节点,末尾就是NULL,但是区间反转需要计数,如果是抵达某一个元素来确定区间,那感觉可以用递归的思路;
- 正向做就是注意指针迭代的先后顺序,不要把指针丢了,该写一个临时变量temp存储都可以大胆写;
- 注意这样写cur指针自己就向后移动了,不需要再跟随i++不断后移了;
- 这道题他反转的时候希望有一个不动量start,但是如果m=1那start就不得不是动量了,所以在前面加了一个"real_head"这个自己添加的节点绝对不会动,这样统一起来好写很多;
- 如果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; }