Java 在节点后插入LinkedList

Java 在节点后插入LinkedList,java,algorithm,linked-list,Java,Algorithm,Linked List,我一直在尝试使用Java在当前节点之后插入一个节点到链表中。我已经能够在当前节点之前插入,但无法使其工作: 以下是insertNodeBefore的代码。我只是想知道是否有一种方法可以调整它,以便能够在当前节点之后插入 // Insert new node nVal to the list before current node curVal public void insertNodeBefore(E nVal, E curVal) { Node<E> newNode =

我一直在尝试使用Java在当前节点之后插入一个节点到链表中。我已经能够在当前节点之前插入,但无法使其工作:

以下是
insertNodeBefore
的代码。我只是想知道是否有一种方法可以调整它,以便能够在当前节点之后插入

// Insert new node nVal to the list before current node curVal 
public void insertNodeBefore(E nVal, E curVal) {
    Node<E> newNode = new Node<E>(nVal);

    Node<E> curr = head;
    Node<E> prev = null;

    if (head.getNodeValue() == curVal) {
        newNode.setNext(head);
        head = newNode;
        return;
    }

    // scan until locate node or come to end of list
    while (curr != null) {
        // have a match 
        if (curr.getNodeValue() == curVal) {
            // insert node
            newNode.setNext(curr);
            prev.setNext(newNode);
            break;
        } else {
            // advanced curr and prev
            prev = curr;
            curr = curr.getNext();
        }
    }
}
//将新节点nVal插入到当前节点curVal之前的列表中
公共空白插入节点前端(E nVal、E curVal){
节点newNode=新节点(nVal);
节点电流=头部;
Node prev=null;
if(head.getNodeValue()==curVal){
newNode.setNext(head);
头=新节点;
返回;
}
//扫描直到找到节点或到达列表末尾
while(curr!=null){
//比赛
if(curr.getNodeValue()==curVal){
//插入节点
newNode.setNext(curr);
上一个设置下一个(新节点);
打破
}否则{
//高级货币和高级货币
上一次=当前;
curr=curr.getNext();
}
}
}

基本上找到节点,然后:

  • 将下一个新节点设置为当前节点
  • 将当前节点的下一个设置为新节点
像这样的方法应该会奏效:

public void insertNodeBeAfter(E nVal, E curVal) {
    Node<E> newNode = new Node<E>(nVal);

    Node<E> curr = head;

    // scan until locate node or come to end of list
    while (curr != null) {
        // have a match 
        // Replaced == with .equals
        if (curr.getNodeValue().equals(curVal)) {
            // insert node
            newNode.setNext(curr.getNext());
            curr.setNext(newNode);
            break;
        } else {
            curr = curr.getNext();
        }
    }
}
public void insertNodeBeAfter(E nVal,E curVal){
节点newNode=新节点(nVal);
节点电流=头部;
//扫描直到找到节点或到达列表末尾
while(curr!=null){
//比赛
//将==替换为.equals
if(curr.getNodeValue().equals(curVal)){
//插入节点
setNext(curr.getNext());
当前设置下一步(新节点);
打破
}否则{
curr=curr.getNext();
}
}
}
注意没有必要对头部进行不同的治疗,因为它不会改变


注意:如果列表为空或未找到
曲线
,则不静默处理可能会很有趣,例如,在给定节点之后抛出
运行时异常

插入实际上比在给定节点之前插入更容易:

// Insert new node nVal to the list after current node curVal 
public void insertNodeAfter(E nVal, E curVal) {
    Node<E> newNode = new Node<E>(nVal);
    Node<E> curr = head;

    // scan until curValnode is found or the end of the list is reached
    while (curr != null) {
        // have a match 
        if (curr.getNodeValue().equals(curVal)) {
            // insert node
            newNode.setNext(curr.getNext());
            curr.setNext(newNode);
            break;
        } else {
            // advanced curr
            curr = curr.getNext();
        }
    }
}
//将新节点nVal插入当前节点曲线后的列表中
公共空白插入节点(E nVal、E curVal){
节点newNode=新节点(nVal);
节点电流=头部;
//扫描直到找到curValnode或到达列表末尾
while(curr!=null){
//比赛
if(curr.getNodeValue().equals(curVal)){
//插入节点
setNext(curr.getNext());
当前设置下一步(新节点);
打破
}否则{
//高级货币
curr=curr.getNext();
}
}
}

我试图分离遍历代码和插入代码,它们都是从您问题中提供的代码中提取的

private void insert(Node<E> prev, Node<E> after, Node<E> newNode) {
    newNode.setNext(after);
    if (prev != null) {
        prev.setNext(newNode);
    } else {
        head = newNode;
    }
}
public Node<E> findPrevOf(E curVal) {
    Node<E> curr = head;
    Node<E> prev = null;
    // scan until locate node or come to end of list
    while (curr != null) {
        // have a match 
        if (curr.getNodeValue() == curVal) {
            return prev;
        } else {
            // advanced curr and prev
            prev = curr;
            curr = curr.getNext();
        }
    }
    throw new Exception("throw an exception to indicate that value does not exist");
}
public void insertNodeAfter(E nVal, E curVal) {
    Node<E> prev = findPrevOf(curVal);
    Node<E> curr = null;
    if (prev == null) {
        curr = head;
    } else {
        curr = prev.getNext();
    }
    Node<E> newNode = new Node<E>(nVal);
    insert(curr, (curr == null ? curr: curr.getNext()), newNode);
}
// Insert new node nVal to the list before current node curVal 
public void insertNodeBefore(E nVal, E curVal) {
    Node<E> prev = findPrevOf(curVal);
    Node<E> newNode = new Node<E>(nVal);
    insert(prev, (prev == null ? head : prev.getNext()), newNode);
}
private void insert(节点前、节点后、节点新节点){
newNode.setNext(之后);
如果(上一个!=null){
上一个设置下一个(新节点);
}否则{
头=新节点;
}
}
公共节点findPrevOf(E曲线){
节点电流=头部;
Node prev=null;
//扫描直到找到节点或到达列表末尾
while(curr!=null){
//比赛
if(curr.getNodeValue()==curVal){
返回上一个;
}否则{
//高级货币和高级货币
上一次=当前;
curr=curr.getNext();
}
}
抛出新异常(“抛出异常以指示该值不存在”);
}
公共空白插入节点(E nVal、E curVal){
节点prev=findPrevOf(曲线);
节点curr=null;
if(prev==null){
curr=头;
}否则{
curr=prev.getNext();
}
节点newNode=新节点(nVal);
插入(curr,(curr==null?curr:curr.getNext()),newNode);
}
//将新节点nVal插入当前节点curVal之前的列表
公共空白插入节点前端(E nVal、E curVal){
节点prev=findPrevOf(曲线);
节点newNode=新节点(nVal);
insert(prev,(prev==null?head:prev.getNext()),newNode);
}

类似于newNode.setNext(curr.getNext())的东西;当前设置下一个(新节点)?如果需要按值查找,而不是仅查找引用,请将
==
替换为
.equals()
。@ArturBiesiadowski它不起作用,抱歉,它仍然将它放在前面。@mort如果列表为空,如何在另一个元素之后插入一个元素?这是一个设计决策,不是错误。@davidorenzomarino:True。不检查
head==null
在本例中是一项功能,而不是一个bug:)@Pat这个答案完全重复了ArturBiesiadowski的评论,你说“不起作用”,谁说如果列表为空,insertNodeAfter需要添加元素?@Davidorenzomarino:你当然是对的。已经修复了。与其更改代码并使其与我的代码相同,不如离开您的实现并简要描述它在空列表中的不同工作方式。。。。这样做并不是一个错误。