当前位置: 首页 > 知识库问答 >
问题:

循环链表无限循环

扶高歌
2023-03-14

我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环?

30, 5, 15, 20, 10, 30, 5, 15, 20, 10, 30, 5, 15, 20, 10, ...
public static void main(String[] args) {

    CircularList theList = new CircularList();
    theList.insert(10);
    theList.insert(20);
    theList.insert(15);
    theList.insert(5);
    theList.insert(30);

    theList.displayList();
    System.out.println(theList.delete());
    theList.delete(15);
    theList.displayList();       

    while (!theList.isEmpty()) {
        Link aLink = theList.delete();
        System.out.println("Deleted: " + aLink);           
    }
    if (!theList.isEmpty()) 
        System.out.println("Program error");
    else
        System.out.println("Program success");

}

CircularList.Class

class CircularList {

private Link current;
private Link prev;

public CircularList() {
    // implement: set both current and prev to null
    current = prev = null;
}

public boolean isEmpty() {
    // implement
    return (current == null); // true if current is empty
}

public void insert(int id) {
    // implement: insert the new node behind the current node
    Link newLink = new Link(id);

    if (isEmpty()) {
        prev = current = newLink;
    } else {
        prev.next = newLink;
        newLink.next = current;
        current = newLink;
    }
}

public Link delete() {
    // implement: delete the node referred by current
    if (!isEmpty()) {
        Link temp = current;
        current = current.next;
        return temp;
    } else 
        return null;
}

public Link delete(int id) {
    // implement: delete the node with value id
    // if no node with the id exists, return null
    if (isEmpty()) {
        return null;
    }

    // Link current; // start probe at beginning
    Link prev = current; // start previous at current 

    while (current != null && current.equals(current)) {
        prev = current; //save previous link
        current = current.next; // move to next Link
    }

    if (current == current.next)
        current = current.next;
    else if (current != null)
        prev.next = current.next;
    return current;

}

public void displayList() {
    // implement: print all the list element values once, each value seperated by comma
    while (current != null) {
        System.out.printf(current + ", ");
        current = current.next;
    }
}
}

链接类

class Link {

private int id;
Link next;

public Link(int id) {
    // implement
    this.id = id;
    next = null;
}

public String toString() {
    return String.valueOf(id);
}
}

共有1个答案

齐招
2023-03-14

这是一个循环列表,除非列表为空,否则delete(int id)displaylist()中的current永远不会为null。

如果回到开始的链接,您必须记住您开始查找/打印的位置。

 类似资料:
  • 基本上,findNode()搜索其数据等于作为参数插入的字符串的节点,但当我调用outputList()方法(该方法返回屏幕上当前节点的字符串表示)时,它将继续无限循环。 outputList方法是: 如有任何帮助,我们将不胜感激。提前道谢。

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我创建了一个双循环链表。 我需要知道每个节点到头部的距离。 因为当我必须删除或获取具有特定密钥的节点时,如果两个节点具有相同的密钥和相同的距离,则必须删除或获取这两个节点,否则必须删除最靠近头部的节点。 我不知道如何计算距离,因为它是圆形的。。。 这个链表的插入就是这样工作的。 所有的节点都去追头。 例: 1)头部 2) 头部A(插入A) 3) 头部B-A(插入B) 4) 头部C-B-A(插入C)

  • 我的任务是用java实现一个循环链表(升序),但问题是它在无限循环中运行 我创建了一个节点类,其中定义了两个元素。 现在,在列表的第二个类中,我做了一个insert函数,我在start中定义了一个节点head=null,并创建了一个新的nNode。之后,我在head部分中检查,如果head==null,那么第一个元素将是nNode。插入第一个元素后,我将比较下一个元素和head元素,如果head元

  • 双向循环链表 在“数据结构”课程中,如果创建某种数据结构的双循环链表,通常采用的办法是在这个数据结构的类型定义中有专门的成员变量 data, 并且加入两个指向该类型的指针next和prev。例如: typedef struct foo { ElemType data; struct foo *prev; struct foo *next; } foo_t; 双向循环链表的

  • 问题内容: 为什么我在递归方法中遇到无限循环,而没有机会输入任何符号来破坏它? 如果您尝试创建错误(将字符串值输入键,然后尝试向其添加数字),则您将在控制台中获得无限的“错误”文本,而不是在第一次错误后,程序应再次询问该数字和然后才决定要做什么。 问题答案: 如果失败,则抛出异常,但不使用无效数据。从文档中: 当扫描程序抛出时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌