Algorithm 实现一种算法,在不遍历循环链表的情况下将节点插入到循环链表中

Algorithm 实现一种算法,在不遍历循环链表的情况下将节点插入到循环链表中,algorithm,Algorithm,我在想解决这个问题的办法 我的输入: 1.具有指向最后一个节点的尾部指针。 2.一旦知道最后一个指针,就可以很容易地在它旁边添加一个新节点 Void Insert(Node N) { if (head == null) // linked list is empty { head = N; tail = N; tail.Next = head; } else { Node temp = tail.Next;

我在想解决这个问题的办法

我的输入:
1.具有指向最后一个节点的尾部指针。
2.一旦知道最后一个指针,就可以很容易地在它旁边添加一个新节点

Void Insert(Node N)
{  
    if (head == null) // linked list is empty
    {
       head = N; tail = N; tail.Next = head;
    } 
    else
    {        
      Node temp = tail.Next; // since this is circular tail will point to head
      Tail.Next = N;
      N.Next = temp; // correct 
      tail = N;       
    }
}
有人能想出不使用尾部指针的更好的解决方案吗?也如问题中所述,无需遍历?
这是一个面试问题,只需要一些输入就可以找到最佳解决方案。

不,你需要尾部指针。否则,您将不得不遍历列表。否则你怎么知道列表的结尾呢


你可以想出一些聪明的索引算法,但它仍然是指向head/tail的指针。

你还有head节点。您也可以使用它插入。我假设在何处插入新节点没有限制(问题没有明确指定)

把它插在头上很简单

编辑将其插入头部之后

如果“更好”的衡量标准是不同时维护头部和尾部指针,那么您可以只维护尾部指针。头部指针是隐式的(由tail.Next给出)


在实践中,访问列表通常非常常见(例如,如果您使用循环列表作为队列),并且有额外的步骤来访问头部可能会增加一些开销。在我做的一个项目的测试中,以这种方式消除头指针会降低一些内存(我们的列表通常很短,但我们有很多),但由于我们经常访问列表的头,时间增加了。YMMV.

我猜您有一个单链接的循环列表,只有一个指向一个元素的指针(称之为head节点)。因此,列表的每个节点都由一个值和一个指向下一个元素的指针组成。尾部节点指向头部节点。直接在头节点之后插入节点是很简单的。我猜您希望直接在头部节点之前插入一个节点。为此,需要将新节点变为最后一个节点,该节点指向前一个最后一个节点,并指向头部节点。现在,您希望避免遍历列表以查找最后一个节点。这意味着您无法访问最后一个节点,因此无法修改其指针。执行此操作的唯一其他方法是修改最后一个节点指向的位置,即:

  • 在头部节点后插入新节点
  • 将当前头部节点的值复制到该新节点
  • 将新值放入当前头部节点
  • 使新节点成为新的头节点

  • 我把你的代码简化了一点。不需要使用temp变量,在设置它之后,您甚至没有使用它

    Void Insert(Node N) {  
        if (head == null) { // linked list is empty
           head = tail = N;
        } 
        else { // insert after tail
          tail.Next = N;
          tail = N;       
        }
        tail.Next = head;
    }
    

    与其储存头部和尾部,不如储存尾部

    Void Insert(Node N)
    {  
        if (tail == null) // linked list is empty
        {
           tail = N.Next = N;
        } 
        else
        {
          N.Next = tail.Next;
          tail = tail.Next = N;
        }
    }
    Node Head() { return tail == null ? null : tail.next; }
    

    插入点在哪里?那里有一个bug,我认为应该是N。Next=temp。除此之外,在我看来,这是一种很好的做事方式……嘿,詹姆,谢谢你抓住了这个错误。我编辑了我的代码。他无法在标题前插入代码,但仍保留列表循环。是的,我同意,但基本上这不是面试官期望的,我可以在标题后插入Umair创意,但这不是我们想要的,我需要在结尾插入它,所以在头后插入就不够了这看起来比我的好。我需要提高我的编码技能,谢谢你的投入