下面是我完整的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方法不会删除该节点(如果它是第一个节点)。我在做什么错了?
答案 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/