链接列表。头部和尾部参考

时间:2014-02-21 16:38:30

标签: java linked-list nodes

我正在尝试为我的链接列表创建一个Add和Delete方法。我用头和尾的名字做了2个引用。

头 - > 1 - > 2 - > 3 - >尾:空

当我尝试删除特定节点时,我一直遇到问题,因为Java说我不在界外。我想是因为我的Head没有指向第一个节点?你们有什么感想?或者我是以完全错误的方式解决这个问题......

public class LinkedList{

    private Node head;
    private Node tail;
    private int listCount;

    public LinkedList()
    {
        head = new ListNode(null);
        tail = new ListNode(null);
        listCount = 0;
    }

    public void add(Object elem){
        ListNode newNode = new ListNode(elem);
        if (size() == 0){
            newNode = head;
            tail = head;
        }
        newNode.setLink(tail);
        tail = newNode;
        listCount++;
        }

    public Object delete(int index)
    // post: removes the element at the specified position in this list.
    {
        // if the index is out of range, exit
        if(index < 1 || index > size())
            throw new IndexOutOfBoundsException();

        ListNode current = head;
        for(int i = 1; i < index; i++)
        {
            if(current.getLink() == null)
                throw new IndexOutOfBoundsException();

            current = current.getLink();
        }
        current.setLink(current.getLink().getLink());
        listCount--; // decrement the number of elements variable
        return current.getInfo();
    }

    public int size() {
        return listCount;
    }

}

public class Node {

    private Node link;
    private Object info;

    public Node(Object info)
    {
        this.info = info;
        link = null;
    }

    public void setInfo(Object info)
    {
        this.info = info;
    }

    public Object getInfo()
    {
        return info;
    }

    public void setLink(Node link)
    {
        this.link = link;
    }

    public Node getLink()
    {
        return link;
    }
}

2 个答案:

答案 0 :(得分:2)

在设置初始(空)链表时,您似乎没有从头到尾初始化链接。

确定。这是在使用单链表时使用的策略(仅限前向链接)。您需要确定列表中允许的操作(例如,仅从头部或尾部添加/删除?;或者在链接列表中的任何位置添加和删除节点(在切断节点后将列表重新组合在一起)。你将允许从任何地方删除节点,然后你需要有一种方法可以无法识别每个节点(这样你就可以毫不含糊地确定将被删除的节点)。你可能还希望能够在之前添加一个节点或者在某个其他节点之后。并且可能需要唯一性。如果您不关心在之前/之后删除或添加的值,那么您可以放宽唯一性约束。

现在要实施战略。从头开始(最初为null)。

  1. 要添加节点,请向下走链接列表,直到找到空的下一个链接。将其替换为您的节点,并将您的节点转发链接设置为null。 (效率提高,尾部始终具有链表中的最后一个节点,如果列表中没有任何内容,则为null)。
  2. 要删除节点,请遍历列表,直至找到要删除的节点,将之前的链接更改为要删除的节点中的链接(现在已完成)
  3. 要在列表末尾添加节点,请转到tail指向的链接(如果为null,则列表为emplty);更改其与节点的链接,确保新节点的链接为空;并将尾部设置为您的节点
  4. 要计算链接列表的大小,请遍历您的树并计算(或者,为了提高计算效率,请保留在添加或删除节点时递增或递减的运行大小。
  5. 这有帮助吗?

    at this link for a full description

答案 1 :(得分:1)

我认为这是因为您的head从不与任何内容相关联。我要做的是修复它,在你的添加方法中,检查列表的size;如果为0,则将头设置为新元素,并将tail设置为head。如果为1,则将head链接到新节点并设置tail。如果它是2,只需将tail的链接设置为新节点并设置tail(就像您现在一样)。

此外,我不确定您是如何实施的,但newNode.setLink(tail);似乎有误...... tail应与newNode相关联。从它看起来的方式来看,似乎你正在尝试newNode - &gt;尾

编辑:好的,这就是为什么我会尝试

public void add(Object elem){
    ListNode newNode = new ListNode(elem);
    if (size() == 0){
        newNode = head;
        tail = head;
    }else if(size() == 1){
        head.setLink(newNode);
        tail = newNode;
    }else{
        tail.setLink(newNode);
        tail = newNode;
    }
    listCount++;
}