Java 在节点后插入LinkedList
我一直在尝试使用Java在当前节点之后插入一个节点到链表中。我已经能够在当前节点之前插入,但无法使其工作: 以下是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 =
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:你当然是对的。已经修复了。与其更改代码并使其与我的代码相同,不如离开您的实现并简要描述它在空列表中的不同工作方式。。。。这样做并不是一个错误。