简体   繁体   中英

how to remove a object from linked list in java?

i have one problem with my code ,i did a sample program to display the emp details from a linked list,now the problem when i trying to delete a particular entry means it doesn't work,i hope i did some mistake in my code could you suggest how to do that?

import java.util.*;

class EmpDedup {
    int record;
    String fprint;
    int fid;

    EmpDedup(int record, String fprint, int fid) {
        this.record = record;
        this.fprint = fprint;
        this.fid = fid;
    }

    public int getRecord() {
        return record;
    }

    public String getFprint() {
        return fprint;
    }

    public int getFid() {
        return fid;
    }

    public static void main(String[] args) {
        int count = 0;
        LinkedList<EmpDedup> list = new LinkedList<EmpDedup>();
        list.add(new EmpDedup(101, "entry1", 20));
        list.add(new EmpDedup(102, "entry2", 30));
        list.add(new EmpDedup(103, "entry3", 40));
        list.add(new EmpDedup(104, "entry4", 50));

        Scanner input = new Scanner(System.in);
        System.out.print("Enter record no to display: ");
        int rec = input.nextInt();
        for (EmpDedup data : list) {
            if (data.getRecord() == rec) {
                System.out.println(data.getRecord() + "\t" + data.getFprint() + "\t" + data.getFid() + "\t");

                count++;

            }
        }
        System.out.println("The size of an linkedlist is: \t" + list.size());

        System.out.println("The number of  available record  is :" + count);

        System.out.println("The size of an linkedlist is: \t" + list.size());
        Scanner input1 = new Scanner(System.in);
        System.out.print("Enter record no to delete: ");// here i try to delete a particular record
        int rec1 = input1.nextInt();
        for (EmpDedup data : list) {
            if (data.getRecord() == rec1) {
                // System.out.println(data.getRecord()+"\t"+data.getFprint()+"\t"+data.getFid()+"\t");
                list.remove(data); // problem is here
                count++;

            }
        }
    }
}

you cannot operate in lists (add, remove... items) while you iterate on them. You have to use an Iterator

for(Iterator<EmpDedup> iter = list.iterator(); iter.hasNext();) {
    EmpDedup data = iter.next();
    if (data.getRecord() == rec1) {
        iter.remove();
    }
}

see http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html

请改用Iterator ,然后在Iterator上使用remove()方法

When you do this:

list.remove(101);

you are calling this method, which will not serve your purpose.

You should rather use:

list.remove(data);

You try to delete element with index 101, but you have only 4 items in list. How it can delete element with index 101?

If you want to delete element that is equals to EmpDedup(101,"entry1",20) than you have to pass in remove method this object. And don't foget to redefine equals and hash code of EmpDedup.

The code tries to remove element at index position 101, but there are only four items in the list.

Use the following as a replacement of your code:

for( EmpDedup data : list)
{
   if( data.getRecord() == rec1 )
   {
        list.remove( data );     
         ++count;
    }
}

That's where a list object will be deleted.

for( EmpDedup data:list)
{
   if(data.getRecord()==rec1)
   {
        list.remove(data);     
         count++;

    }
 }

import java.util.Scanner;

// A complete working Java program to demonstrate deletion in singly // linked list class LinkedList { Node head; // head of list

/* Linked list Node*/
class Node
{
    int data;
    Node next;
    Node(int d)
    {
        data = d;
        next = null;
    }
}

/* Given a key, deletes the first occurrence of key in linked list */
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;
}

/* Inserts a new Node at front of the list. */
public void push(int new_data)
{
    Node new_node = new Node(new_data);
    new_node.next = head;
    head = new_node;
}

/* This function prints contents of linked list starting from
    the given node */
public void printList()
{
    Node tnode = head;
    while (tnode != null)
    {
        System.out.print(tnode.data+" ");
        tnode = tnode.next;
    }
}

/* Drier program to test above functions. Ideally this function
should be in a separate user class. It is kept here to keep
code compact */
public static void main(String[] args)
{
    LinkedList llist = new LinkedList();

    llist.push(7);
    llist.push(1);
    llist.push(3);
    llist.push(2);

    System.out.println("\nCreated Linked list is:");
    llist.printList();

    Scanner sc = new Scanner(System.in);
    System.out.println("please enter input");
    int aa =sc.nextInt();
    llist.deleteNode(aa); // Delete node at position 4

    System.out.println("\nLinked List after Deletion at position :"+aa);


    llist.printList();

    System.out.println("adding element to the LinkedList");

    System.out.println("enter element");
    int dd = sc.nextInt();
    llist.push(dd);

    llist.printList();
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM