我有一个双向链表的实现,并且我试图删除给定位置的特定节点。我设法将第二个节点删除到最后一个节点,但是当我尝试删除第一个节点失败时,我想知道我的代码出了什么问题。 head.next.previous = null; head = head.next; 这是我的代码
public class Proses { private class Node{ String Matkul; int NilaiUts; int NilaiUAS; Node previous;
 Node next;
    public Node(String Matkul, int Nilai, int NilaiUAS) {
        this.Matkul = Matkul;
        this.NilaiUts = Nilai;
        this.NilaiUAS = NilaiUAS;
    }  
}  
Node head, tail = null;    
public void addNode(String matkul, int Nilai, int NilaiUAS) {   
    Node newNode = new Node(matkul, Nilai, NilaiUAS);   
    if(head == null) {   
        head = tail = newNode;    
        head.previous = null;  
        tail.next = null;  
    } else {  
        tail.next = newNode;   
        newNode.previous = tail;  
        tail = newNode;  
        tail.next = null;  
    }  
}  
public void delete(int position){
    if (head == null || n <= 0) 
        return; 
    Node current = head; 
    int i; 
    for (i = 1; current != null && i < position; i++) 
    { 
        current = current.next; 
    } 
    if (current == null) 
        return; 
    deleteNode(head, current); 
}
//delete function
public Node deleteNode(Node head, Node del){
    if (head == null || del == null){
        return null; 
    }
    if (head == del){
        head = del.next;
        del.next.previous = null;
    }
    if (del.next != null){
        del.next.previous = del.previous; 
    }
    if (del.previous != null){
        del.previous.next = del.next; 
    }
    del = null; 
    return head; 
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
使用你的代码,如果场景以一个节点结束(头将指向该节点)并且你要删除该节点(即头),则代码将失败,并出现NullPointerException
del.next.previous = null; 因为del.next为NULL;
可以看下面的代码从双链表中删除一个节点
// Function to delete a node in a Doubly Linked List. 
// head_ref --> pointer to head node pointer. 
// del --> data of node to be deleted. 
void deleteNode(Node head_ref, Node del) 
{ 
    // Base case 
    if (head == null || del == null) { 
        return; 
    } 
    // If node to be deleted is head node 
    if (head == del) { 
        head = del.next; 
    } 
    // Change next only if node to be deleted 
    // is NOT the last node 
    if (del.next != null) { 
        del.next.prev = del.prev; 
    } 
    // Change prev only if node to be deleted 
    // is NOT the first node 
    if (del.prev != null) { 
        del.prev.next = del.next; 
    } 
    // Finally, free the memory occupied by del 
    return; 
} 
代码参考:https://www.geeksforgeeks.org/delete-a-node-in-a-doubly-linked-list/