我已经编写了代码,从给定密钥的链表中删除了一个节点。但是,当我尝试删除此处的第一个节点然后遍历列表时,它仍显示先前存在的第一个节点。有人可以告诉我我在做什么错吗?我的整个代码都以类名开头
public class LinkedList {
//removing Node nested class
public void buildList1() {
head=new Node(1);
head.next=new Node(3);
head.next.next=new Node(5);
head.next.next.next=new Node(7);
}
public boolean removeNode(Node head,int x) {
//1 3 5 7---to delete 5
Node q=head;//q
// Node p=head.next;//p
Node prev=null;
if(q!=null && q.data==x) {
head=q.next;
//q=null;
System.out.println("next to head" + head.data);
return true;
}
while(q!=null && q.data!=x) {
prev=q;
q=q.next;
}
if(q==null)
return false;
prev.next=q.next;
return true;
}
public void printList()
{
Node tnode = head;
while (tnode != null)
{
System.out.print(tnode.data+" ");
tnode = tnode.next;
}
}
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
System.out.println(list.removeNode(list.head, 1));
list.printList();
}
}
答案 0 :(得分:1)
将head添加为实例变量,然后从removeNode函数中删除该参数。您应该可以使用this
关键字在方法中引用此变量。
类似这样的东西(未经测试,但希望您能理解):
public class LinkedList {
//removing Node nested class
private Node head;
public void buildList1() {
this.head=new Node(1);
this.head.next=new Node(3);
this.head.next.next=new Node(5);
this.head.next.next.next=new Node(7);
}
public boolean removeNode(int x) {
Node q=this.head;
Node prev=null;
if(q!=null && q.data==x) {
this.head=q.next;
return true;
}
while(q!=null && q.data!=x) {
prev=q;
q=q.next;
}
if(q==null)
return false;
prev.next=q.next;
return true;
}
public void printList()
{
Node tnode = this.head;
while (tnode != null)
{
System.out.print(tnode.data+" ");
tnode = tnode.next;
}
}
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
System.out.println(list.removeNode(1));
list.printList();
}
}
答案 1 :(得分:1)
@JD D的回答很好,但是我会更轻松地执行removeNode
方法。
public boolean removeNode(int x) {
tempNode = this.head;
prevNode = null;
if (this.head != null && this.head.data == x) {
this.head = this.head.next;
return true;
}
while (tempNode != null) {
if (tempNode.data == x) {
prevNode.next = tempNode.next;
return true;
}
prevNode = tempNode;
tempNode = tempNode.next;
}
return false;
}
答案 2 :(得分:0)
public static void main(String args[]) {
LinkedList list=new LinkedList();
list.buildList1();
list.printList();
list.remove(2);
list.printList();
}
LinkedList有一个方法库,其中一个是remove(int index)。如图所示使用它。
答案 3 :(得分:0)
如果您的head
节点不是您的第一个节点,而您的第一个真实节点是您的(固定)next
的{{1}}个节点,那么您的生活将会更加简单。
这样,当第一个(实际)节点被删除时,您将不需要特殊的代码来处理这种情况。
答案 4 :(得分:0)
尝试直接使用您创建的列表。可能的两种解决方案。 首先:使用创建的列表
if (q != null && q.data == x) {
this.head = q.next;//use this to refer the list you created
// q=null;
System.out.println("next to head" + head.data);
return true;
}
第二:传递列表本身
public boolean removeNode(LinkedList list, int x) {
// 1 3 5 7---to delete 5
Node q = list.head;// q
}
//Call it like this
System.out.println(list.removeNode(list, 1));