当前位置: 首页 > 面试题库 >

Java中的循环LinkedList

沈良策
2023-03-14
问题内容

我正在读一本书,重新整理了我的数据结构,它提出的一个问题是不使用“第一个”和“最后一个”指针来构建一个循环的单链表,而是通过使用一个引用来访问它。当前”。我不确定我是否理解这个问题,我一直以为我至少需要第一个或最后一个。这是我的实现,但是它具有“
first”,不确定如何解决。您能否评论一下如何调整代码以消除对第一代码的依赖?

class Link {
    public int iData;              
    public Link next;

    public Link(int id) { // constructor
        iData = id;                         
    }

    public void displayLink() {
        System.out.print(iData + " ");
    }
}  // end class Link

然后是列表本身:

public class CircularLinkedList {
    private Link first;
    private Link current;

    public Link getCurrent(){
        return current;
    }

    public void setCurrent(int data){

    }

    public void advance(){
        current = current.next;
    }

    public void insert(int data) {
        Link newLink = new Link(data);
        if (first == null) { 
            first = current = newLink;
        } else {
            current.next = newLink;
        }
        current = newLink;
        newLink.next = first;
    }
    ...
}

问题答案:

如果您有一个循环链表,则每个节点都指向连续循环中的下一个节点。因此,没有最后也没有第一。在这种情况下,您只需要将一个指针指向数据结构(该问题称为“当前”),因为您可以遍历整个列表,直到返回起点为止。

一个节点可能看起来像这样:

public class ListNode<T> {
    private T element;
    private ListNode<T> next;
}

因此,在这种环境下,当您将第一个节点添加到列表中时,它的“下一个”指针将指向自身。当您添加第二个节点时,每个“下一个”指针将指向另一个。当您添加第三个节点时,它们将分别指向下一个节点,并且大概以某种方式对其进行了排序。添加的每个其他节点将插入循环中的适当位置。

像这样的数据结构的一个很好的用法是可以每天或每小时重复一次的时间表。所有事件都可以存储在循环列表中,并且“当前”指针始终指向下一个计划的位置。

显然,当搜索这样的列表时,您需要保留对第一个节点的引用。这是您知道是否搜索了整个列表的唯一方法,因为它没有以空的“ next”指针结尾。

编辑: 正如下面的(大量)注释中所述,对于插入操作,“尾巴”指针似乎是一个非常好的主意。这是我发布的原始方法,现已重命名insertAfter

public void insertAfter(int data) {
    Link newLink = new Link(data);
    if (current == null) { 
        newLink.next = newLink;
        current = newLink;
    } else {
        newLink.next = current.next;
        current.next = newLink;
    }
}

尾指针将始终指向列表的最后一个节点。这也是第一个节点之前的节点,因为列表是循环的。因此,(tail.next == current)在操作指针时一定要维护。这是新的插入方法:

public void insert(int data) {
    Link newLink = new Link(data);
    if (current == null) { 
        current = newLink;
        tail = newLink;
        newLink.next = newLink; // tail.next = current!
    } else {
        tail.next = newLink; // tail.next = current!
        newLink.next = current;
        current = newLink; // tail is unchanged, newLink is current
    }
}

插入值应该正确地使它们混乱。为了在添加时保持顺序,add应使用以下方法:

public void add(int data) {
    this.insert(data);
    this.advance();
}

这是的代码advance

public void advance() {
    if (current != null) {
        tail = current;
        current = tail.next; // tail.next = current!
    }
}

像这样用来创建列表时…

list1.add(1);
list1.add(2);
list1.add(3);
list2.insert(3);
list2.insert(2);
list2.insert(1);

…两个列表都按1-2-3顺序排列,其中1作为当前顺序。



 类似资料:
  • 我需要对while或do循环进行编码,以确定用户输入的数字是否在特定范围内(30

  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 问题内容: 给定一个以复杂的,循环的方式相互引用的类实例的集合:垃圾收集器是否可能无法释放这些对象? 我隐约记得过去这是JVM中的问题,但我 认为 这在几年前已解决。但是,在jhat中进行的一些调查显示,循环引用是我现在面临的内存泄漏的原因。 注意:我一直给人以JVM能够解析循环引用并从内存中释放这种“垃圾岛”的印象。 但是,我提出这个问题只是为了看看是否有人发现了任何异常。 问题答案: 循环引用

  • 问题内容: 美好的一天! 我正在做一个游戏,但我希望它有背景声音。我为此创建了一个类,并在主类上调用它。我的代码如下: 这是我上课的主要地点。 我的问题是音乐无法播放。这是什么意思?我的文件类型为Microsoft Wave声音格式,大小为796kb。我可以知道我做错了吗?您的建议将不胜感激。先感谢您。 问题答案: 我的猜测是文件已以类无法理解的格式进行编码。我找不到该类的文档(??),但是我会尝

  • 我已经有一段时间没有编程了,我正在努力回到事情的转折点,这就是我已经走了多远。我的问题是,我如何循环第二个问题,这样,如果回答不是肯定的,它会再次问这个问题。我曾尝试在if语句周围放置一个循环,但每当我尝试从用户那里获得另一个响应时,它告诉我无法使用变量response来执行此操作。我觉得这是一个简单的修复,因为我理解循环,但我有一个困难的时候围绕着这个具体的问题我的头,提前谢谢你。

  • 我已经创建了一个字符串数组,其中包含单词“磅”、“美元”和“欧元”,我想把这些标签放在旗帜的左边(为了用户应用程序的清晰性,因为不是每个用户都知道哪个货币属于哪个国家)。 我创建了一个循环,将创建一个标签,并将其分配到旗帜的左侧,它应该使一个"英镑"标签,然后一个"美元",然后一个"欧元"每次穿越Y轴南部,使他们与旗帜对齐然后,它将重置数组计数以返回到正确的字符串,沿着x轴移动并再次重复。然而,它