c-链表反向不带临时



有没有任何方法可以在不使用C中的临时变量的情况下反转链表?提前谢谢。

著名的方法:

Element *reverse(Element *head)
{
    Element *previous = NULL;
    while (head != NULL) {
        // Keep next node since we trash
        // the next pointer.
        Element *next = head->next;
        // Switch the next pointer
        // to point backwards.
        head->next = previous;
        // Move both pointers forward.
        previous = head;
        head = next;
    }
    return previous;
}

使用温度变量

Saurabh

请注意,您的temp使用实际上生成了两个swap()调用,并且可以替换为:

swap(head->next,previous);
swap(previous,head);

您可以使用xor在没有temps的情况下进行交换,这被称为xor交换。

在指针上使用XOR交换来伪造XOR链表。

实现留给读者作为练习

递归方法:

Element *reverse(Element *head, Element **first)
{
    if (head->next == NULL)
    {
        *first = head;
        return head;
    }

     Element* NextElement= reverse  (head->next, first);
     NextElement->next = head;
     head->next = null;
     return head;
}

调用递归函数:

   Element *revLinkListHead;
   reverse(head, &revLinkListHead);

如果有人仍然感兴趣,这里的解决方案根本不使用新变量,除了递归调用中传递的变量。

public static List invert(List l) {
    invert(l.next, l, l);
    l = l.next;
    breakCycle(l, l);
    return l;
}
private static void invert(List l, List toBeNext, List first) {
    if(l.next == null) {
        l.next = toBeNext;
        first.next = l;
    } else {
        invert(l.next, l, first);
        l.next = toBeNext;
    }
}
private static void breakCycle(List l, List first) {
    if(l.next == first) {
        l.next = null;
    } else {
        breakCycle(l.next, first);
    }
}

其思想如下:首先,我们递归地运行inverse函数,并实现它,以便当它到达最后一个元素时,它将其指定为当前头的下一个元素(参数first)。在我们执行它之后,我们将有一个反向列表,但它是循环的,所以当前的head.next将指向反向列表的头。我们将head重新分配给它的下一个元素(反向列表的实际head),最后要做的就是打破这个循环。所以我们调用breakCycle,它递归地完成任务!

相关内容

  • 没有找到相关文章

最新更新