如何在Java中从链表中删除?
因此,作为家庭作业的一部分,我用Java编写了自己的链表(和列表节点) 现在,我正在尝试删除条目,但函数不起作用 我知道这个概念:如何在Java中从链表中删除?,java,list,Java,List,因此,作为家庭作业的一部分,我用Java编写了自己的链表(和列表节点) 现在,我正在尝试删除条目,但函数不起作用 我知道这个概念: 搜索保留上一个节点的节点 告诉上一个节点指向下一个节点 返回或停止使用节点,以便GC擦除它 由于某种原因,它不起作用。我可以一次又一次地删除具有相同值的节点。恐怕这与Java指针有关 守则: 节点: 公共类SimpleNode{ 私人股本价值; 私有SimpleNode next; 公共SimpleNode(){ this.value=null; this.ne
- 搜索保留上一个节点的节点李>
- 告诉上一个节点指向下一个节点李>
- 返回或停止使用节点,以便GC擦除它
公共类SimpleNode{
私人股本价值;
私有SimpleNode next;
公共SimpleNode(){
this.value=null;
this.next=null;
}
公共NoSimples(E数据,SimpleNode参考){
这个值=数据;
this.next=ref;
}
//接球手和接球手
}
名单:
公共类LinkedList实现了Iterable{
私人单纯形头;
私有整数大小=0;
公共链接列表(){
this.head=新的SimpleNode();
}
公共void添加(SimpleNode节点){
this.addFirst(node.getValue());
}
公共无效添加优先(E项){
SimpleNode nonde=新的SimpleNode(项目,this.head);
this.head=节点;
大小++;
}
公共无效添加(E值){
此.addFirst(值);
}
公共SimpleNode removeFirst(){
SimpleNode节点=this.head;
if(node==null){
返回null;
}否则{
this.head=node.getNext();
node.setNext(空);
这个尺寸--;
返回节点;
}
}
公共SimpleNodes删除(E值){
SimpleNode nodeAnt=this.head;
SimpleNode节点=this.head.getNext();
while(节点!=null){
如果(node.getValue()!=null&&node.getValue().equals(value)){
setNext(node.getNext());
node.setNext(空);
返回节点;
}
nodeAnt=节点;
node=node.getNext();
}
返回null;
}
//其他不相关的方法。
}
多个问题:
1,2,3,4
。现在,如果您试图删除1
,代码将失败nodeAnt=node
应该是nodeAnt=nodeAnt.getNext()
。记住,它们都是引用,不是对象public void remove(E e){
prev = head;
removeElement(e, head);
System.gc();
}
private void removeElement(E e, Node currentElement) {
if(currentElement==null){
return;
}
if(head.getData().equals(e)){
head = head.getNext();
size--;
}else if(currentElement.getData().equals(e)){
prev.setNext(currentElement.getNext());
size--;
}
prev = prev.getNext();
removeElement(e, currentElement.getNext());
}
注意:我根据需要删除元素的所有引用。您可能需要它有所不同。Java中的概念是,如果一个对象没有更多的引用,那么GC最终会清理它。在您的情况下,只需从LinkedList中删除该对象即可。要从LinkedList中删除,您只需从迭代器中迭代and调用.remove()。是的,但我在上面的代码中尝试这样做,但它不起作用。您似乎跳过了删除中的第一个节点:
nodeAnt=this.head
。这意味着第一个节点在你看它之前就已经是“前”节点了。虽然“它不工作”是各种问题和错误报告中的经典错误描述,但它并没有太大帮助……请解释一下。System.GC真的有必要吗?实际上,没有。完全取决于JVM何时释放内存,但我还是添加了它。没什么区别@如果设置“-XX:+DisableExplicitGC”并进行一些更改,则将忽略TiagoSiriousSystem.gc()。请更正算法(例如,添加prev的instantiation),以便我可以接受答案。@TiagoSirious我不理解你的意思。我的代码失败了吗?你能告诉我它失败的测试用例吗?
public class LinkedList<E> implements Iterable<SimpleNode<E>> {
private SimpleNode<E> head;
private int size = 0;
public LinkedList() {
this.head = new SimpleNode<E>();
}
public void add(SimpleNode<E> node) {
this.addFirst(node.getValue());
}
public void addFirst(E item) {
SimpleNode<E> nonde = new SimpleNode<E>(item, this.head);
this.head = node;
size++;
}
public void add(E value) {
this.addFirst(value);
}
public SimpleNode<E> removeFirst() {
SimpleNode<E> node = this.head;
if (node == null) {
return null;
} else {
this.head = node.getNext();
node.setNext(null);
this.size--;
return node;
}
}
public SimpleNodes<E> remove(E value) {
SimpleNode<E> nodeAnt = this.head;
SimpleNode<E> node = this.head.getNext();
while (node != null) {
if (node.getValue()!= null && node.getValue().equals(value)) {
nodeAnt.setNext(node.getNext());
node.setNext(null);
return node;
}
nodeAnt = node;
node = node.getNext();
}
return null;
}
// Other irrelevant methods.
}
public void remove(E e){
prev = head;
removeElement(e, head);
System.gc();
}
private void removeElement(E e, Node currentElement) {
if(currentElement==null){
return;
}
if(head.getData().equals(e)){
head = head.getNext();
size--;
}else if(currentElement.getData().equals(e)){
prev.setNext(currentElement.getNext());
size--;
}
prev = prev.getNext();
removeElement(e, currentElement.getNext());
}