思路
局部反转链表:头插法
定义两个指针,分别称之为 g(guard 守卫) 和 p(point)。 首先根据方法的参数 m 确定 g 和 p 的位置。将 g 移动到第一个要反转的节点的前面,将 p 移动到第一个要反转的节点的位置上。以 m=2,n=4为例。将 p 后面的元素删除,然后添加到 g 的后面。也即头插法。
3、根据 m 和 n 重复步骤(2)
4、返回 dummyHead.next
class Solution {public: ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode* dummyNode = new ListNode(0); dummyNode->next = head; ListNode* g = dummyNode;//初始化指针 ListNode* p = dummyNode->next; for(int i = 0; i < left - 1; ++i)//找到 局部反转链表 的左边界 { g = g->next;//将 g 移动到第一个要反转的节点的前面 p = p->next;//将 p 移动到第一个要反转的节点的位置上 } for(int i = 0; i < right - left; ++i)//头插法插入节点 { ListNode* removed = p->next; p->next = p->next->next; removed->next = g->next; g->next = removed; } return dummyNode->next; }};