删除链表中给定键的节点

时间:2019-03-27 23:15:11

标签: java

我已经编写了代码,从给定密钥的链表中删除了一个节点。但是,当我尝试删除此处的第一个节点然后遍历列表时,它仍显示先前存在的第一个节点。有人可以告诉我我在做什么错吗?我的整个代码都以类名开头

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();

    }

}

5 个答案:

答案 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));