【问题标题】:linked list reverse without temp没有温度的链表反向
【发布时间】:2012-01-11 22:20:30
【问题描述】:

有什么方法可以在不使用 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;
}

使用临时变量

苏拉布

【问题讨论】:

标签: c data-structures linked-list


【解决方案1】:

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

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

您可以使用 xor 进行无临时交换,它被称为 xor swap

【讨论】:

    【解决方案2】:

    在指针上使用XOR-swaps 来伪造XOR-linked-list.

    实现留给读者作为练习。

    【讨论】:

      【解决方案3】:

      递归方法:

      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);
      

      【讨论】:

        【解决方案4】:

        如果有人仍然感兴趣,这里是完全不使用新变量的解决方案,除了那些在递归调用中传递的变量。

        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);
            }
        }
        

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

        【讨论】:

          猜你喜欢
          • 2019-02-27
          • 2011-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-29
          • 1970-01-01
          相关资源
          最近更新 更多