Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有重复项,则添加到链表的前面方法,否则删除重复项_Java_Linked List_Add_Singly Linked List - Fatal编程技术网

Java 如果没有重复项,则添加到链表的前面方法,否则删除重复项

Java 如果没有重复项,则添加到链表的前面方法,否则删除重复项,java,linked-list,add,singly-linked-list,Java,Linked List,Add,Singly Linked List,我很难想出链表的添加方法。我的任务是: 在MoveToFront内部实现此方法,即public void add(E项) 班级。该方法的行为如下:当输入不存在于 链接列表,将其添加到前面;否则,请删除现有的 从列表中选择一个,然后重新插入到前面 到目前为止,我所做的是创建一个contains和delete方法,该方法将搜索列表中的现有项,然后将其删除。然后它会将该项添加到列表的前面 public int getLength() { Node<E> curNode = firs

我很难想出链表的添加方法。我的任务是:

在MoveToFront内部实现此方法,即public void add(E项) 班级。该方法的行为如下:当输入不存在于 链接列表,将其添加到前面;否则,请删除现有的 从列表中选择一个,然后重新插入到前面

到目前为止,我所做的是创建一个
contains
delete
方法,该方法将搜索列表中的现有项,然后将其删除。然后它会将该项添加到列表的前面

public int getLength() {
    Node<E> curNode = first;
    int count = 0;
    while (curNode != null) {
        curNode = curNode.next;
        count++;
    }
    return count;
}

public boolean Contains(E item) {
    if (first == null) {
        return false;
    }
    Node<E> currentNode = first;
    while (currentNode.next != null) {
        containCount++;
        if (currentNode.item.equals(item)) {
            return true;
        }
        currentNode = currentNode.next;
    }
    return false;
}

public E Delete(int kth) {
    if (kth <= getLength()) {
        Node<E> currentNode = first;
        for (int i = 1; i < kth; i++) {
            currentNode = currentNode.next;
        }
        currentNode.next = currentNode.next.next;
        return currentNode.item;
    } else {
        return null;
    }
}

public void add(E item) {

    if (!Contains(item)) {
        Node<E> myNode = new Node<E>(item, null);
        first = myNode;
    } else {
        Delete(containCount);
        Node<E> myNode = new Node<E>(item, null);
        first = myNode;
    }
}
public int getLength(){
节点curNode=第一个;
整数计数=0;
while(curNode!=null){
curNode=curNode.next;
计数++;
}
返回计数;
}
公共布尔包含(E项){
if(first==null){
返回false;
}
节点当前节点=第一个;
while(currentNode.next!=null){
containCount++;
if(currentNode.item.equals(item)){
返回true;
}
currentNode=currentNode.next;
}
返回false;
}
公共E删除(int-kth){

如果(kth我认为您没有正确链接节点。在将要插入的节点设置为
第一个
节点之前,请将节点的
下一个
设置为旧的
第一个
,如下所示:

myNode.next = first;
first = myNode;
有几件事:

  • 您可以重写delete(),只需遍历列表并在找到匹配项时删除,而不必两次检查列表中是否包含该项,然后再查找和删除它。然后,您可以在add()方法的开头调用此方法

  • 您应该使用一个简单的实例变量来跟踪列表的大小,每当添加或删除某个项目时,该变量都会更新,然后让getLength()返回该变量。每次查看整个列表的开销太大了


  • 首先,我在代码中看到了一个getLength()方法,它是一个链表,如果你想得到这个问题的长度,那么你就没有得到数据结构

    现在,如果我们开始实施,我从要求中看到,您必须以某种方式在前端添加新元素。我将这样做-

  • 创建一个节点并将其链接到当前列表的第一个元素旁边。这将是add方法。您也可以在最后使用此方法,它不会有太大区别
  • 然后开始搜索列表中的元素,如果找到匹配项,则将其删除。确保与前面添加的元素不匹配

  • 你没有说你到底有什么问题。你给我们看的代码有什么不起作用?