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

如果元素已被搜索,则重新排序单个链表?

訾凯歌
2023-03-14
public class SearchLinkedList<E> {
    private Node<E> first;

    public static void main(String[] args){
     SearchLinkedList<Integer> list = new SearchLinkedList<Integer>();
     
     list.insert(1000);
     list.insert(2000);
     list.insert(3000);
     
     System.out.println(list.getFirst());
   }

    public SearchLinkedList() {
      first = null;
   }

    public void insert(E e) {
        if (first == null) {
            first = new Node<E>(e);
        } else {
            //while(temp.next.searched == true) then insert new Node where the next node is null or searched == false
            Node<E> temp = new Node<E>(e);
            temp.next = first;
            first = temp;
        }
    }
    
    public E getFirst() {
        return first.data;
    }

    public E find(E x) {
        if (first == null) {
            return null;
        } else {
            //while (temp != null) if node found set it's searched = true and move it to front of list
            Node<E> temp = first;
            while (temp != null) {
                if (temp.data.equals(x)) {
                    temp.searched = true;
                    return temp.data;
                }
                temp = temp.next;
            }
            return temp.data;
        }
    }

    private static class Node<E> {
        private E data;
        private boolean searched;
        private Node<E> next;

        private Node(E e) {
            data = e;
            searched = false;
            next = null;
        }
    }
}

因此,这里的任务是创建一个LinkedList类,如果已经搜索了节点,它会将节点移动到列表的前面(第一个)。这里的第一张图片是当它被调用时:

list.insert(1000);
list.insert(2000);
list.insert(3000);

第二个图像是当这被称为:

list.find(3000);
list.find(2000);

所以目标是在调用find并找到包含数据的节点时:将其搜索布尔值设置为true,并将该节点移动到列表的前面。到目前为止,我的insert只是将新节点放在列表的前面。insert and find中的注释解释了我想让它们做什么。然而,将一个元素从单个linkedlist的中间移动到前面似乎很难。我不知道该怎么办。你可以自己复制并尝试。调用列表后。find(2000年) 然后是列表。getFirst()我们应该得到2000美元。问题是如何。。。我的想法是,我是否应该让节点的布尔值决定是否在前方。。。我一点也不确定。


共有1个答案

潘驰
2023-03-14

我想你应该这样做:

public class SearchLinkedList<E> {
private Node<E> first;

public static void main(String[] args) {
    SearchLinkedList<Integer> list = new SearchLinkedList<Integer>();

    list.insert(1000);
    list.insert(2000);
    list.insert(3000);

    System.out.println(list.getFirst());

    System.out.println(list.find(3000));
    System.out.println(list.getFirst());
    list.insert(4000);
    System.out.println(list.find(200));
}

public SearchLinkedList() {
    first = null;
}

public void insert(E e) {
    if (first == null) {
        first = new Node<E>(e);
    } else {
        //while(temp.next.searched == true) then insert new Node where the next node is null or searched == false
        Node<E> temp = first;
        while (temp.next != null && temp.next.searched) {
            temp = temp.next;
        }
        Node<E> node = new Node<>(e);
        if (temp.next != null) {
            node.next = temp.next;
        }
        temp.next = node;
    }
}

public E getFirst() {
    return first.data;
}

public E find(E x) {
    if (first == null) {
        return null;
    } else {
        //while (temp != null) if node found set it's searched = true and move it to front of list
        Node<E> temp = first;
        while (temp != null) {
            if (temp.data.equals(x)) {
                temp.searched = true;
                break;
            }
            temp = temp.next;
        }
        if (temp == null) return null;

        pushForward(temp);
        return temp.data;
    }
}
//Find pre-linked node with our node, bind our node with parent next node
//and link parent with node.
private void pushForward(Node<E> node) {
    if (first == null || first.next == null) return;
    Node<E> temp = first;
    while (temp.next != null) {
        if (temp.next.equals(node)) {
            temp.next = temp.next.next;
            node.next = first;
            first = node;
            break;
        }
        temp = temp.next;
    }
}

private static class Node<E> {
    private E data;
    private boolean searched;
    private Node<E> next;

    private Node(E e) {
        data = e;
        searched = false;
        next = null;
    }
}

}

你也可以混合使用pushForwardfind方法,通过列表(O(n))中的一次迭代,让find做你想做的事情,因为那里有O(n^2)。可能会有帮助:https://www.geeksforgeeks.org/java-program-for-inserting-node-in-the-middle-of-the-linked-list/

 类似资料:
  • 假设我在R中有一个数组:在排序时,这将是: 在R中,从原始数组返回已排序数组元素的索引的最佳方法是什么。我正在寻找一个类似的输出:6(索引为2)、4(索引为3)、3(索引为4)、2(索引为7)、5(索引为8)、1(索引为10)

  • 我在天气应用程序上设置了一个滑动刷新面板,以便在向下滑动刷新按钮时更新从 API 收到的天气数据。当搜索城市时,此功能运行良好,但现在的问题是,如果我在向下滑动刷新面板之前尚未搜索任何城市,它将永远重新加载,直到我退出阻碍应用程序进程的应用程序,并且我的应用程序设计为在用户再次搜索城市之前不保存以前的天气数据。 我想要么在搜索城市之前完全停止刷新面板重新加载,要么只是限制在搜索城市之前重新加载所需

  • 我试图在我的envers表中查找一个对象,但是我没有PK。代替PK,我有一个字段(“孩子”)。这是我的疑问, 列表结果列表=读卡器。createQuery()。用于修改实体(TP.class、false、true)。添加(AuditEntity.property(“子”)。eq(nodeid))。getResultList(); 但是我明白了: 原因:org。冬眠PropertyNotFoundE

  • 我正在尝试将多个已排序的列表合并到一个树集中。。然后我考虑在树集上应用二进制搜索算法,以O(logn)的时间复杂度检索元素。。 下面是我的代码,我在其中一个方法中传递列表列表,并将它们组合成以避免重复...所有列表中的排序- 首先,这是将多个排序列表合并到树集的正确方法吗?有没有直接的方法可以有效地合并TreeSet中的多个排序列表 或者,与我目前使用的数据结构相比,我更适合使用另一种数据结构?

  • 本文向大家介绍jQuery拖动元素并对元素进行重新排序,包括了jQuery拖动元素并对元素进行重新排序的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery拖动元素并对元素进行重新排序的实现方法,分享给大家供大家参考,具体实现内容如下 效果图: 具体内容如下: 从上图可以看出我们今天要实现的功能。当用户拖动一个图片时,就能改变图片的已有排序并更新表中的排列顺序。比如用户可以随意拖动我

  • 9.5. 搜索元素 通过一步步访问每一个节点的方式遍历 XML 文档可能很乏味。如果你正在寻找些特别的东西,又恰恰它们深深埋入了你的 XML 文档,有个捷径让你可以快速找到它:getElementsByTagName 。 在这部分,将使用 binary.xml 语法文件,它看上去是这样的: 例 9.20. binary.xml <?xml version="1.0"?> <!DOCTYPE gra