Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm - Fatal编程技术网

Java 在单个链接列表中添加节点

Java 在单个链接列表中添加节点,java,algorithm,Java,Algorithm,晚上好 我试图自己实现一个单链表,但在创建搜索方法时遇到了一个问题。显然,当您想要搜索节点(将用于在特定位置插入节点)时,必须计算一些值,以查看是否到达了正确的位置。考虑到我的节点只有一个数据字段作为标识符,我认为除了使用它之外没有其他方法。但是,由于数据字段不是唯一的,因此可能有多个符合条件的节点 考虑以下列表:5、7、2、8、3、1、6、5、8、4、2。 当我想在列表中的某个地方添加一个节点时(比如:在值为8的节点之后),他将遍历列表并在第一次出现“8”之后添加新节点。如果我想在第2个8之后

晚上好

我试图自己实现一个单链表,但在创建搜索方法时遇到了一个问题。显然,当您想要搜索节点(将用于在特定位置插入节点)时,必须计算一些值,以查看是否到达了正确的位置。考虑到我的节点只有一个数据字段作为标识符,我认为除了使用它之外没有其他方法。但是,由于数据字段不是唯一的,因此可能有多个符合条件的节点

考虑以下列表:5、7、2、8、3、1、6、5、8、4、2。 当我想在列表中的某个地方添加一个节点时(比如:在值为8的节点之后),他将遍历列表并在第一次出现“8”之后添加新节点。如果我想在第2个8之后插入它,该怎么办

单链表也能做到这一点吗

除此之外,我希望对我的'removeLast()'方法有一些反馈,该方法似乎不符合我的要求(从列表中删除最后一个节点)。我知道如果列表只有1个值,我的代码就不应该工作,我将在删除最后一个节点的常规代码工作后尽快研究它

我的代码可以找到

编辑代码:

 public class SingleLinkedList {

 public void deleteLast() {
    if (lastNode != null) {
        Node currentNode = firstNode;

        while (currentNode != null) {
            Node nextNode = currentNode.getNextNode();
            Node nextNextNode = nextNode.getNextNode();

            if (nextNextNode == null) {
                nextNextNode = null;
                lastNode = nextNode;
            }
        }
        listSize--;
    }
}

}

确保可以做到这一点-您需要跟踪途中经过的对象数量,并且在经过
n
对象等于搜索对象后,插入新数据:

public void addAfterNth(Object data,Object o, int n) { 
    Node curr = firstNode;
    while (curr != null) { 
        if (curr.data.equals(o)) n--;
        if (n == 0) { 
            Node newNode = new Node(data,curr.nextNode);
            curr.setNext(newNode);
            break;
        }
        curr = curr.getNextNode();
    }
}
在这里,在数据等于
o
的节点第次遇到
n
之后,插入一个新节点,该节点的数据在参数
data
中表示

运行时使用:

SingleLinkedList list = new SingleLinkedList();
list.addLast(5);
list.addLast(7);
list.addLast(2);
list.addLast(8);
list.addLast(3);
list.addLast(1);
list.addLast(6);
list.addLast(5);
list.addLast(8);
list.addLast(4);
list.addLast(2);
list.drawList();
list.addAfterNth(999,8, 2);
System.out.println("");
list.drawList();
收益率(如预期):


确保可以完成-您需要跟踪途中经过的对象数量,并且在通过
n
对象后,插入新数据:

public void addAfterNth(Object data,Object o, int n) { 
    Node curr = firstNode;
    while (curr != null) { 
        if (curr.data.equals(o)) n--;
        if (n == 0) { 
            Node newNode = new Node(data,curr.nextNode);
            curr.setNext(newNode);
            break;
        }
        curr = curr.getNextNode();
    }
}
在这里,在数据等于
o
的节点第次遇到
n
之后,插入一个新节点,该节点的数据在参数
data
中表示

运行时使用:

SingleLinkedList list = new SingleLinkedList();
list.addLast(5);
list.addLast(7);
list.addLast(2);
list.addLast(8);
list.addLast(3);
list.addLast(1);
list.addLast(6);
list.addLast(5);
list.addLast(8);
list.addLast(4);
list.addLast(2);
list.drawList();
list.addAfterNth(999,8, 2);
System.out.println("");
list.drawList();
收益率(如预期):


下面是用于删除LL的最后一个代码的伪代码。以上答案正确地回答了您在特定位置插入的问题

if (START == NULL){
    Print: Linked-List is empty.
}
else{
    PTR = START, PREV = START
    while (PTR->LINK != NULL)enter code here
        PREV = PTR //Assign PTR to PREV
    PTR = PTR->LINK //Move PTR to next node

    ITEM = PTR->INFO //Assign INFO of last node to ITEM
    If (START->LINK == NULL) Then //If only one node is left
        START = NULL //Assign NULL to START
    Else
        PREV->LINK = NULL //Assign NULL to link field of second last node

    Delete PTR
}

下面是用于删除LL的最后一个代码的伪代码。以上答案正确地回答了您在特定位置插入的问题

if (START == NULL){
    Print: Linked-List is empty.
}
else{
    PTR = START, PREV = START
    while (PTR->LINK != NULL)enter code here
        PREV = PTR //Assign PTR to PREV
    PTR = PTR->LINK //Move PTR to next node

    ITEM = PTR->INFO //Assign INFO of last node to ITEM
    If (START->LINK == NULL) Then //If only one node is left
        START = NULL //Assign NULL to START
    Else
        PREV->LINK = NULL //Assign NULL to link field of second last node

    Delete PTR
}

这是可能的,但您的方法的语义是什么?在某个数字出现后插入一个数字?这里也有。我不知道我为什么说晚上。请把代码放在你的问题里面。@nhahdh:我想在指定的位置添加一个节点。问题是我不知道如何指定这个特定的点,因为唯一定义节点的是它们的数据,而数据不是唯一的。我在考虑在列表中使用他们的“索引”,但如果我需要索引,为什么我要使用列表而不是数组?如果是晚上,你的时区将与…东京大致相同。这是可能的,但你的方法的语义是什么?在某个数字出现后插入一个数字?这里也有。我不知道我为什么说晚上。请把代码放在你的问题里面。@nhahdh:我想在指定的位置添加一个节点。问题是我不知道如何指定这个特定的点,因为唯一定义节点的是它们的数据,而数据不是唯一的。我正在考虑在列表中使用他们的“索引”,但如果我需要索引,为什么我要使用列表而不是数组?如果是晚上,你的时区将与…东京大致相同。谢谢你添加这个!我用下面的代码让它自己工作:谢谢你添加这个!我用下面的代码让它自己工作:不客气。请注意,如果请求的元素数小于
n
(例如,如果在上面的示例中插入
n==4
),它将被静默忽略-这可能不是一件好事。在这些情况下,您可能应该抛出异常或返回
false
(将签名更改为返回
boolean
,而不是“void”)。欢迎使用。请注意,如果请求的元素数小于
n
(例如,如果在上面的示例中插入
n==4
),它将被静默忽略-这可能不是一件好事。在这些情况下,您可能应该抛出异常或返回
false
(将签名更改为返回
boolean
,而不是“void”)。