我正在尝试删除单链表中另外两个节点中间的节点。
public void deleteAfter(Node del){
del.next=del.next.next;
}
删除指定节点之后的节点del。
我得到一个空指针异常。我认为问题是在删除后,与其他节点的链接被破坏了。我怎样修补它。这是我的完整代码:
public class Node{
public Object item;
public Node next;
public Node(){
item=null;
next=null;
}
public Node(Object x){
item=x;
next=null;
}
public void insertAfter(Node after,Object x){
Node newNode=new Node(x);
newNode.next=after.next;
after.next=newNode;
}
public void deleteAfter(Node del){//Deletes the node that is after the specified node
del.next=del.next.next;
}
public static void main (String args[]){
Node front=new Node(),p=new Node(),q=new Node();
p.item="green";
q.item="red";
p.next=q;
front=p;
front.deleteAfter(p);
front.insertAfter(p,"black");
front.insertAfter(q,"blue");
front.insertAfter(q.next,"orange");
front.deleteAfter(q);
System.out.println(front.item);
System.out.println(front.next.item);
System.out.println(front.next.next.item);
System.out.println(front.next.next.next.item);
}
}
答案 0 :(得分:1)
首先,您的列表应该记住最后一个元素或头部。
public class YourList{
Node heaed;
public YourList(){
head = null;
}
public void insert(Node node){
if(last == null){
head = node;
}
}
public void deleteAfter(Node del){
if(del.next == head)){
head = del;
}
if(del.next == null){
//do nothing because there is nothing to delete
}
else{
del.next=del.next.next;
}
}
}
答案 1 :(得分:0)
目前:
p.next=q;
front=p;
front.deleteAfter(p);
front.insertAfter(p,"black");
您已创建一个从p
开始的双节点链接列表,并将front
指向它,然后将其缩减为单节点链接列表,并将其恢复为两个,包括: {“green”,“black”}。 q
是一个单例列表节点,您稍后可以操作它。
从front
开始打印时,由于它只有两个节点,因此尝试获取不存在的第三个节点的item
会导致异常。
你的问题始于询问你的deleteAfter()
是否有问题,而且它会无法正确处理任何正确的节点列表,只有一个实际上有一些东西的列表。传入空列表或只包含一个节点的列表将导致异常。
答案 2 :(得分:0)
您可以先使用两个指针方法找到中间节点,然后删除该节点。
public Node findMiddleNode(Node node){
Node runner = node;
while(node!=null){
node = node.next;
if(node != null){
node = node.next;
runner = runner.next;
}
}
return runner;
}
public static boolean deleteNode(Node node){
if(node==null || node.next==null) return false;
Node next = node.next;
node.data = next.data;
node.next = next.next;
return true;
}
答案 3 :(得分:0)
首先计算列表大小并删除n / 2元素而不使用两个指针的解决方案。
例如,如果给定的链表是1-> 2-> 3-> 4-> 5,则链表应该被修改为1-> 2-> 4-> 5。如果有偶数节点,那么将有两个中间节点,第二个中间元素被删除。例如,如果给定的链表是1-> 2-> 3-> 4-> 5-> 6那么它应该被修改为1-> 2-> 3-> 5-> ; 6
public void deleteMiddle() {
if (head == null) {
System.out.println("List is emplty");
return;
} else if (head.next == null) {
head = null;
return;
} else {
int count = 0;
int nodeDeleteIndex = 0;
Node node = this.head;
Node temp = this.head;
// To calculate the list size
while (node != null) {
count++;
node = node.next;
}
// getting the n/2 index of the node which needs to be deleted
nodeDeleteIndex = (count / 2);
for (int i = 0; i < nodeDeleteIndex - 1; i++) {
temp = temp.next;
}
temp.next = temp.next.next;
}
}