algorithm – 给出块大小时反转单链表

存在单个连接的链表并且给出块大小.例如,如果我的链表是1-> 2-> 3-> 4-> 5-> 6-> 7-> 8 -NULL和我的块大小为4然后反转前4个元素然后反转第4个元素.问题的输出应该是4-> 3-> 2-> 1-> 8-> 7- > 6-→5-NULL

我正在考虑将链表分成大小为4的段,然后将其反转.
但是那样我就不得不使用很多额外的节点了.
空间复杂性应保持在最低限度.

如果有人能够提供更好的解决方案,将额外节点的使用保持在最低限度,那将是非常值得注意的.

最佳答案 我试过这个…似乎工作得很好……

node* reverse(node* head) // function to reverse a list
{
    node* new_head = NULL;
    while(head != NULL)
    {
        node* next = head->next;
        head->next = new_head;
        new_head = head;
        head = next;
    }
    return new_head;
}

node* reverse_by_block(node* head, int block)
{
    if(head == NULL)
            return head;

    node* tmp = head;
    node* new_head = head;
    node* new_tail = NULL;

    int count = block;
    while(tmp != NULL && count--)
    {
        new_tail = tmp;
        tmp = tmp->next;
    }

    new_tail->next = NULL;
    new_tail = new_head;
    new_head = reverse(new_head);
    new_tail->next = reverse_by_block(tmp,block);

    return new_head;
}
点赞