本文共 1887 字,大约阅读时间需要 6 分钟。
为了优化给定的链表反转代码,从位置m到n进行反转,可以使用双指针法高效地完成任务。以下是优化后的步骤解析:
步骤:
确定反转的子链表范围:
引入辅助指针:
slow_ptr
从链表头开始,移动到节点m的位置。fast_ptr
从节点n的位置开始,移动到链表末尾。移动慢指针到节点m:
slow_ptr
,直到它指向节点m的位置。调整快指针位置:
fast_ptr
从节点n开始,移动到链表末尾,确保它没有超出子链表的范围。反转子链表:
slow_ptr
到达节点m,保持fast_ptr
在子链表末尾,逐步反转子链表。连接反转后的子链表:
处理剩余部分:
以下是优化后的代码:
class Solution {public: ListNode* reverseBetween(ListNode* head, int m, int n) { if (!head || m <= 0 || n >= m || n >= head->next) return head; int num = m - 1; dummy = new ListNode(-1); dummy->next = head; ListNode* slow = head; n -= m; while (m--) { slow = slow->next; } ListNode* cur = slow; while (n--) { cur = cur->next; } em *end = cur->next; cur->next = NULL; *slow_ptr = reverseList(slow); ptr fast = slow_ptr; while (fast->next) { fast = fast->next; } fast->next = end; while (num--) { st = st->next; } st->next = slow_ptr; return dummy->next->next; } ListNode* reverseList(ListNode* c) { if (!c || !c->next) return c; return reverseList(c->next); } static struct Node { int val; struct Node *next; explicit Node(int v) : val(v), next(nullptr) {} };}
步骤说明:
初始化辅助指针:
dummy
节点作为起始点,便于处理边界问题。dummy->next = head
确保链表的整体结构。移动slow_ptr
到节点m:
slow_ptr
到节点m的位置。调整fast_ptr
到节点n的位置:
fast_ptr
,从节点n开始移动到链表的末尾。然后,逐步内部反转子链表。反转子链表:
reverseList
完成。连结逆转后的子链表:
恢复余下部分的指针:
dummy
节点后的节点指向反转后的子链表,确保链表的路线正确。注意事项:
通过以上步骤,可以在一次链表遍历中高效地实现反转操作,避免额外的空间复杂度,确保代码简洁且高效执行。
转载地址:http://jleyk.baihongyu.com/