题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
核心思路主要是借助临时头结点,找到需要翻转链表的前驱位置,然后将要翻转链表的节点摘下进行子链表的头部插入即可
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) { if (head == NULL || head->next == NULL || m == n) return head; //借助临时头结点,可以统一所有的情况进行处理,尤其是翻转的链表从第一个节点开始 struct ListNode* new_head = (struct ListNode*)malloc(sizeof(struct ListNode)); new_head->next = head; //pre指向翻转子链表的前驱节点 struct ListNode* pre = new_head; for (int i = 1; i < m; ++i) { //寻找头插位置 pre = pre->next; } //head指向翻转子链表的首部 head = pre->next; for (int i = m; i < n; ++i) { //将p节点摘下进行子链表的头部插入 struct ListNode* p = head->next; head->next = p->next; p->next = pre->next; pre->next = p; } head = new_head->next; free(new_head); return head; }