-1

我是一名 Java 初学者,目前正在从事一个几乎完成的项目。

我需要删除、修改和提取列表的元素(这是一个基本元素,尽管我知道有 arrayList(s)。)这让我自己发疯,因为我确切地知道我需要做什么,但我不是得到我需要的东西开始编程。

package lec05;

import java.util.*;

/**
 *
 * @author ulacit
 */
public class Lista {

Celda head;

public Lista() {
    head = null;
}

public void add(Person aPerson) {
    if (head == null) {  // list = empty
        head = new Celda(aPerson);
    } else if (aPerson.getId() < head.getInfo().getId()) {  // add element - left
        Celda aux = new Celda(aPerson);
        aux.setNext(head);
        head = aux;
    } else if (head.getNext() == null) {  // add 1 element - right
        Celda aux = new Celda(aPerson);
        head.setNext(aux);
    } else { // more than 1 - add at the end or in the middle
        Celda actual = head;
        while (actual.getNext() != null
                && actual.getNext().getInfo().getId() < aPerson.getId()) {
            actual = actual.getNext();
        }
        Celda aux = new Celda(aPerson);
        aux.setNext(actual.getNext());
        actual.setNext(aux);
    }
}

public boolean (int id) {
    Celda aux = head;
    while (aux != null && aux.getInfo().getId() < id) {
        aux = aux.getNext();
    }
    return (aux != null && aux.getInfo().getId() == id);
}

public Person restore(int id) {
    Celda aux = head;
    while (aux != null && aux.getInfo().getId() < id) {
        aux = aux.getNext();
    }
    if (aux != null && aux.getInfo().getId() == id) {
        return aux.getInfo();
    } else {
        return null;
    }
}

public void remove(int id) {

}

public void modify(int id, String name) {

}
public Persona extract(int id) {
}

@Override
public String toString() {
    String s = "List{";
    Celda aux = head;
    while (aux != null) {
        s += aux.getInfo() + ", ";
        aux = aux.getNext();
    }
    return s;

}
}
4

3 回答 3

1

一点都不难。。

你有你的头,Lista你有的是一个单链表

这是一个单链表的图示。 链表

因此,例如,当您调用时remove(int x),(假设 x 是 Celda 的 id)

Some pseudocode
 aux=Head
 1. Check if you have aux (aux !=null)
 2. Check if the aux has that id
 2.1. if not move to the next Celda and start the same question (aux = aux.getNext()) 
 2.2 if it has, you know what to delete, so you have to have a reference to the previous  Celda of aux if it exist in this method, so know the previous.getNext() = aux.getNext() 

删除操作

如果您可以使用图像进行可视化,那么对其进行编码会容易得多;)。

于 2013-06-15T00:35:17.770 回答
1

提示:

  1. 你不应该实现你自己的列表数据结构......除非你特别需要这样做。最好改用现有List类型;例如 要么ArrayList要么LinkedList

  2. 你的代码不会编译...

  3. 逐步开发:

    • 在尝试对其余方法进行编码之前,完成并测试add(Person),get(id)toString()方法。

    • 一次开发/测试剩余的方法。

  4. 实现你自己的单元测试。(这不是强制性的,但它会帮助你系统地测试你的代码。单元测试不需要很漂亮......)

  5. 如果你被卡住了,有很多关于“数据结构和算法”的好教科书解释了链表是如何工作的。

  6. 你所拥有的是一个单链表;即列表中的节点具有到下一个节点的链接......但不是前一个节点。对单个链表进行操作的技巧是,当您迭代列表时,您(通常)需要跟踪包含指向您“查看”的链接的节点。例如,要从列表中删除一个节点,您需要能够在当前节点之前修改该节点。

于 2013-06-15T00:12:31.813 回答
0

如果要添加和删除,则需要指针。您继续引用“getNext”,但没有下一个指针。将指针视为每个元素的连接。如果你有 2 个元素,你怎么知道哪个是第一个,哪个是第二个。你必须有一些关系。

这是一个很棒的入门教程:http ://www.dreamincode.net/forums/topic/143089-linked-list-tutorial/

于 2013-06-15T00:06:25.570 回答