将一个链表的给定的区间翻转,如下所示
解决思路应该很多,这里只写一个我个人比较熟悉的解决方法:
遍历要翻转的区间,从第二个开始,一个一个依次插入到区间最前的位置。
将pre指针先移动到需要翻转的需要翻转的区间之前,last指针为翻转区间第一个节点,也就是pre下一个节点,cur为当前要插入到区间最前位置的节点,每次遍历它的位置都是在last之后。也就是说只有cur需要不断改变指向。
代码如下
public static Node? ReverseBetween(Node? head, int left, int right)
{
//虚拟节点是为了防止处理头结点时出错
Node? dummy = new(-1);
dummy.next = head;
//先将pre移到要翻转的区间之前的位置
Node? pre = dummy;
int count = 0;
while (count < left - 1)
{
pre = pre?.next;
count++;
}
//开始一个一个插入到区间头的位置
Node? last = pre?.next;
Node? cur;
count = 0;
while (count < right - left)
{
cur = last?.next;
last.next = cur.next;
cur.next = pre.next;
pre.next = cur;
count++;
}
return dummy.next;
}