无法从链接列表中删除第一个节点

时间:2018-06-27 11:13:22

标签: java data-structures linked-list

下面是我完整的Node类代码,用于在链接列表中创建节点以及一些向列表中添加更多节点,打印所有列表内容并从列表中删除节点的方法:

public class Node {
Object data;
Node next;

public Node(Object data) {
    this.data = data;
}

public void printList() {
    Node node = this;
    while (node != null) {
        System.out.println(node.data);
        node = node.next;
    }
}

public void add(Object data) {

    Node node = this;
    while (node.next != null) {
        node = node.next;
    }
    node.next = new Node(data);
}

public void delete(Object data) {
    Node node = this;

    if (node.data.equals(data)) {
        node = node.next;
        return;
    }

    while (node.next != null) {
        if (node.next.data.equals(data)) {
            node.next = node.next.next;
            return;
        }
        node = node.next;
    }
}

}

所有方法都能正常工作,但delete方法不会删除该节点(如果它是第一个节点)。我在做什么错了?

4 个答案:

答案 0 :(得分:2)

您的问题是,您永远不会删除节点。您在 //////// Collected from databse /////// $question_id=$question_id+1; //$no_questions = $dbo->query("select count(qst_id) from poll_qst")->fetchColumn(); $no_questions = $dbo->query("select count(question) from questions left join servey_question on questions.question_id = servey_question.question_id where servey_id = serv01 ")->fetchColumn(); print("name = $no_questions\n"); if($question_id > $no_questions){ $next='F'; // Flag is set to display thank you message }else{ $next='T'; // Flag is set to display next question $count=$dbo->prepare("select * from questions where question_id=$question_id"); if($count->execute()){ $row = $count->fetch(PDO::FETCH_OBJ); } } $main= array("data"=>array("q1"=>"$row->question","opt1"=>"$row->opt1","opt2"=>"$row->opt2","opt3"=>"$row->opt3","opt4"=>"$row->opt4","opt5"=>"$row->opt5","opt6"=>"$row->opt6","question_id"=>"$question_id"),"next"=>"$next"); // end of collection from database ////// echo json_encode($main); 方法中所做的就是更改局部变量delete(Object data)

答案 1 :(得分:2)

因为您在第一个节点上调用了printList。这是不正确的方式。您可以定义LinkedList类,并且可以在其中定义私有的静态嵌套Node类。

(?=

对于当前解决方案,您可以更改delete方法并返回节点的引用。

class LinkedList{
 private Node head; 
 private static class Node{
   //define the methods here
  }

}

答案 2 :(得分:2)

您不能用当前的实现删除第一个Node,因为第一个节点是this,并且您不能在Node类内对其进行更改。但是,您可以做的是稍微更改delete方法并返回Node类的新实例。

public Node delete(Object data) {
    Node node = this;
    if (node.data.equals(data)) {
        return node.next;
    }
    while (node.next != null) {
        if (node.next.data.equals(data)) {
            node.next = node.next.next;
            return node;
        }
        node = node.next;
    }
    return null;
}

因此,如果要删除第一个节点,则必须将其放在新变量中,或重新设置它。示例:

 Node node = new Node(1);
 node.add(2);
 node.add(4);
 node.add(3);
 node.delete(3);
 node = node.delete(1);
 node.printList();

答案 3 :(得分:1)

要从链接列表中删除节点,我们需要执行以下步骤。 1)查找要删除的节点的上一个节点。 2)更改了上一个节点的下一个。 3)释放要删除的节点的可用内存。

void deleteNode(int key)
{
    // Store head node
    Node temp = head, prev = null;

    // If head node itself holds the key to be deleted
    if (temp != null && temp.data == key)
    {
        head = temp.next; // Changed head
        return;
    }

    // Search for the key to be deleted, keep track of the
    // previous node as we need to change temp.next
    while (temp != null && temp.data != key)
    {
        prev = temp;
        temp = temp.next;
    }    

    // If key was not present in linked list
    if (temp == null) return;

    // Unlink the node from linked list
    prev.next = temp.next;
}

来源:https://www.geeksforgeeks.org/linked-list-set-3-deleting-node/