如何从java中的链表中删除一个对象?
Posted
技术标签:
【中文标题】如何从java中的链表中删除一个对象?【英文标题】:how to remove a object from linked list in java? 【发布时间】:2012-05-30 21:46:17 【问题描述】:我的代码有一个问题,我做了一个示例程序来显示链接列表中的 emp 详细信息,现在当我尝试删除特定条目时出现问题意味着它不起作用,我希望我犯了一些错误在我的代码中你能建议怎么做吗?
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++;
【问题讨论】:
“无法正常工作” - 请提供更多描述性。发生了什么? list.remove(101);这不应该是 list.remove(data); 【参考方案1】:导入 java.util.Scanner;
// 一个完整的工作Java程序来演示单独删除 // 链表 类链表 节点头; // 列表头
/* 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();
【讨论】:
【参考方案2】:代码尝试删除索引位置 101 处的元素,但列表中只有四个项目。
使用以下代码替换您的代码:
for( EmpDedup data : list)
if( data.getRecord() == rec1 )
list.remove( data );
++count;
这是一个列表对象将被删除的地方。
【讨论】:
【参考方案3】:当您对列表进行迭代时,您不能在列表中进行操作(添加、删除...项目)。你必须使用迭代器
for(Iterator<EmpDedup> iter = list.iterator(); iter.hasNext();)
EmpDedup data = iter.next();
if (data.getRecord() == rec1)
iter.remove();
见http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html
【讨论】:
【参考方案4】:for( EmpDedup data:list)
if(data.getRecord()==rec1)
list.remove(data);
count++;
【讨论】:
【参考方案5】:您尝试删除索引为 101 的元素,但列表中只有 4 个项目。它如何删除索引为 101 的元素?
如果要删除等于 EmpDedup(101,"entry1",20) 的元素,则必须将这个对象传入 remove 方法。不要忘记重新定义 EmpDedup 的 equals 和 hash code。
【讨论】:
【参考方案6】:当你这样做时:
list.remove(101);
您正在调用this 方法,这将不符合您的目的。
你应该使用:
list.remove(data);
【讨论】:
【参考方案7】:使用Iterator
代替,然后在Iterator
上使用remove()
方法
【讨论】:
以上是关于如何从java中的链表中删除一个对象?的主要内容,如果未能解决你的问题,请参考以下文章