【问题标题】:Java Programming - Circular LinkedListJava 编程 - 循环链表
【发布时间】:2010-11-29 04:41:02
【问题描述】:

我正在尝试编写一个 java 类 CircularList,其中包含通常的 Node 内部类和实例变量:

【问题讨论】:

  • 这个接缝像作业..我猜对了吗?
  • 你好同学!请尝试一些东西,当你到达一个点时你被卡住了,我们可以推动你一点。 Imo 查看您实验室实践中的第一个讲座幻灯片和第一个练习。
  • 如果您向他们展示您迄今为止所做的尝试,人们会愿意提供帮助。
  • 重新标记到作业并修复了该列表(这显然表明这是作业)

标签: java linked-list


【解决方案1】:

好的,我不会给你这个类的完整实现,而是给你一些建议。

  1. 您不需要保留对最后一个元素的引用。放置一个 Prev 和 Next 对您的节点的引用,您的最后一个节点将是第一个。Prev
  2. 除了循环列表没有结尾之外,它们与常规列表完全一样,但是您可以在其中找到最后一项:

    节点 tmp = first;

    while ( tmp.Next != null ) tmp = tmp.Next;

在循环列表中的想法是这样的:

Node tmp = first;

while ( tmp.Next != first )
   tmp = tmp.Next;

因为你永远找不到指向 null 的节点,除非列表为空。最后一个建议,如果你需要实现一个索引器,请记住在循环列表中没有索引超出范围之类的东西,因为

list[count] = list[0] = list[count * k]

请记住这一点,因此计算这些方法的索引可能非常棘手。对于正数索引,主要思路是:

index = index % count;

对于负数略有不同。我希望我能用我的话帮助你。如果你想要一个实现,我相信如果你礼貌地问谷歌应该有几个:)

祝你好运!

【讨论】:

  • 您好,我添加了我想出的程序,需要更多帮助。谢谢
  • 你能帮我看看这个吗?
【解决方案2】:

我不确定您的问题是什么,您似乎拥有所需的一切。该链表与普通链表之间的唯一区别是添加到末尾。

在常规链表中,您将创建一个新节点并使最后一个元素指向该节点。在这种情况下,您将 •Last 节点中的指针更改为指向新节点,并使新节点指向 •First。

删除的工作方式与普通链表相同。每当您要删除一个节点时,您都​​会找到另一个指向该节点的节点(前一个节点,或者在删除第一个节点的情况下,检查 •Last)并使其指向被删除节点指向的任何位置。

如果这不能解决您的问题,请告诉我,我会尽力提供帮助。

刚刚注意到有人已经问过完全相同的问题: Can I use java.util.LinkedList to construct a circular/cyclic linked list?

【讨论】:

  • 您好,我添加了我想出的程序,需要更多帮助。谢谢
  • 首先,我相信您在 removeLast() 中有一个错误:通过在 while 循环中执行 current.setNextNode(..) 您正在使每个节点都指向第一个节点。您希望在 while 之外拥有它,因此只有倒数第二个节点的指针被更改。对于这个问题,您只需使用 p 作为参数调用 removeByPosition() 。更改此函数以在末尾设置 tail=current.getNextNode() 。然后继续以 p 作为参数调用它,直到只剩下 1 个节点。
  • 你能帮我看看这个吗?
【解决方案3】:

提示...循环列表应该有下一个和上一个,而不是第一个和最后一个。逻辑很重要

【讨论】:

    【解决方案4】:
    class Node    {
        int value;
        Node next;
        Node prev;
        Node(int initialValue)    {
            value = initialValue;
            next =  null;
            prev = null;
        }
        public int getValue()    {
            return this.value;
        }
    }
    
    class NodeList    {
        Node pointer;
        NodeList()    {
            pointer = null;
        }
        public void insertNode(int nodeValue)    {
            Node newNode = new Node(nodeValue);
            if( pointer == null )    {
                newNode.next = newNode;
                newNode.prev = newNode;
            }else if( pointer.next == null && pointer.prev == null && pointer != null )    {
                newNode.next = pointer;
                newNode.prev = pointer;
                pointer.prev = newNode;
                pointer.next = newNode;
            }
            else if( pointer != null )    {
                newNode.next = pointer.next;
                newNode.prev = pointer;
                pointer.next.prev = newNode;
                pointer.next = newNode;
            }
            pointer = newNode;
            System.out.println(“Successfully inserted : ” + pointer.getValue());
        }
        public void printRing( boolean direction )    {
            Node tempNode = pointer;
            do    {
                System.out.println( “Value = ” + tempNode.getValue() );
                tempNode = direction ? tempNode.next : tempNode.prev;
            } while( tempNode.value != pointer.value );    
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 2021-07-05
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多