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

Java链表搜索和删除方法

郏扬
2023-03-14
问题内容

我有一个计算机科学课程的项目,除一种方法外,其他所有工作都已完成。删除方法。基本上,我是根据用户输入创建一个链表,并且需要能够删除所有节点(已完成)并删除单个指定节点。所以我需要在节点列表中搜索找到要删除的节点并将其删除。任何可以帮助的人都表示赞赏。如果您有解决方案,请在我尝试学习并解决问题时提供解释。

我不会为您提供GUI,因为我认为这不是必需的,但这里是节点类。

public class MagazineList {
private MagazineNode list;

    public MagazineList(){
        list = null;
    }


public void add(Magazine mag){
    MagazineNode node = new MagazineNode(mag);
    MagazineNode current;

    if(list == null) {
        list = node;
    }
    else {
        current = list;
        while(current.next != null)
            current = current.next;
        current.next = node;
    }   
}
public void insert(Magazine mag) {
  MagazineNode node = new MagazineNode (mag);

  // make the new first node point to the current root
  node.next=list;

  // update the root to the new first node
  list=node;
}

public void deleteAll() {
    if(list == null) {

    }

    else {
        list = null;
    }
}
public void delete(Magazine mag) {
    //Delete Method Goes Here
}

public String toString(){
    String result = " ";

    MagazineNode current = list;
    while (current != null){
        result += current.magazine + "\n";
        current = current.next;     
    }
    return result;
}
private class MagazineNode {
    public Magazine magazine;
    public MagazineNode next;


    public MagazineNode(Magazine mag){
        magazine = mag;
        next = null;
    }
}
}

更新

这是我放在一起的方法,它贯穿第一部分进入while循环,并且永远不会识别列表中的相同项目。我对输入和删除方法使用了完全相同的东西,但它无法识别它。任何帮助表示赞赏。

public void delete (Magazine mag) {
MagazineNode current = list;
MagazineNode before;

before = current;

if(current.equals(mag)){
    before.next = current;
    System.out.println("Hello");
}

while ((current = current.next)!= null){
    before = current.next;
    System.out.println("Hello Red");

    if(current.equals(mag)){
        current = before;
        System.out.println("Hello Blue");
    }
}
 }

问题答案:

没有勺子喂你答案。删除有点像删除链中的一个链接-剪掉该链接,然后将两个(新)端连接起来。

因此,删除“ B”表示更改

A --> B --> C --> D

对此

A --> C --> D

在伪代码中,算法为:

  • 从第一个节点开始算法
  • 检查它是否是您要删除的那个
  • 如果不是,请转到下一个节点并再次检查(返回上一步)
  • 如果是这样,则使上一个节点的下一个节点成为该节点的下一个节点
  • 从该节点删除对下一个节点的引用


 类似资料:
  • 我正在尝试为我一直在研究的BST结构实现一个移除方法。以下是包含查找、插入和删除方法的代码: 我被告知可以使用insert方法来帮助我使用remove方法,但我只是不知道如何获取最小/最大的元素,然后用该值替换我正在删除的元素,然后递归地删除我获取替换值的节点,同时仍然保持O(logn)的复杂性。有人有什么想法或明显的漏洞我错过了,或任何其他有帮助的,因为我撞我的头在这个问题上? 编辑:我用答案的

  • 我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:

  • 首先,这是家庭作业,所以把它放在外面。 我应该用特定的方法实现二叉查找树: void insert(字符串)、boolean remove(字符串)和boolean find(字符串)。 我已经能够成功地编程和测试插入,并找到方法,但我有困难与删除。 我的程序中发生的事情是,删除实际上并没有从树中删除任何东西,我相信这是因为它只引用当前节点的本地创建,但我可能错了。我认为我可以实现我需要测试的不同

  • 我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。 运行代码时得到的输出是: 移除90后的树。70 80 85 98 100 120 移除70. 80 85 98 100 120后的树 移除85后的树。80 98 100 120 移除98后的树。80 100 120 移除80后的树。100 120 移除120后的树。100 移除100后的树。100

  • 我在比较< code>removeAll(集合的速度时获得了一些乐趣 让我们假设我有两个不太小的集合,比如100000个连续的整数元素,而且它们大部分重叠,例如,5000个在左边,而不是右边。现在我只需打电话: 当然,这一切都取决于左集合和右集合的类型。如果正确的集合是一个哈希图,那么它会非常快,因为这就是查找的地方。但仔细一看,我发现了两个我无法解释的结果。我尝试了所有的测试,既有排序的<cod

  • 我在做单链表实现,我记得Linus Torvalds在这里谈到过。 在单链表中,为了删除节点,我们应该可以访问上一个节点,然后更改它当前指向的节点。 因此,无论如何,我们都应该可以访问上一个节点。 但是Linus Torvalds通过在C中使用地址的概念删除了这个特例。因此head也有“前面的东西”,即指向head的head的地址。因此,他使用了C的指针和地址特性来删除特殊情况。 我认为这种单链表