【问题标题】:Linked Lists. Head and Tail References链接列表。头尾参考
【发布时间】:2014-02-21 16:38:29
【问题描述】:

我正在尝试为我的链表类创建一个添加和删除方法。我用名称 Head 和 Tail 做了 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;
    }
}

【问题讨论】:

  • 这里是一个疯狂的猜测,但newNode.setLink(tail) 应该是相反的方式?
  • @webuster 我不确定你的意思,你能详细说明一下吗?谢谢欣赏!

标签: java linked-list nodes


【解决方案1】:

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

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

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

  1. 要添加节点,请沿着链接列表向下走,直到找到一个空的下一个链接。将其替换为您的节点,并将您的节点转发链接设置为空。 (效率提升,尾部总是有链表中的最后一个节点,如果链表中什么都没有,则为null)。
  2. 要删除节点,遍历列表直到找到要删除的节点,将之前的链接更改为要删除的节点中的链接(您现在完成了)
  3. 要在列表的末尾添加一个节点,转到tail指向的链接(如果为null,则列表为空);更改其与您的节点的链接,确保您的新节点在其链接中具有空值;并将尾部设置为您的节点
  4. 要计算链表的大小,可以遍历树并计数(或者,为了提高计算效率,请保持在添加或删除节点时递增或递减的运行大小。

这有帮助吗?

at this link for a full description

【讨论】:

  • 是的,我就是这么想的!我正在向自己教授链接列表,所以很难掌握这个概念。你能详细说明一下吗?
【解决方案2】:

我认为这是因为您的 head 从未链接到任何东西。我会在你的 add 方法中修复它,检查列表中的size;如果为 0,则将 head 设置为新元素并将 tail 设置为等于 head。如果为 1,则将head 链接到新节点并设置tail。如果是 2,只需将 tail 的链接设置到新节点并设置 tail(就像你现在一样)。

另外,我不确定你是如何实现它的,但newNode.setLink(tail); 似乎是错误的...tail 应该链接到newNode。从它的外观来看,您似乎正在尝试执行 newNode -> tail

编辑:好的,这就是我要尝试的原因

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++;
}

【讨论】:

  • 好吧,我想我明白了...也许哈哈!
  • 试试看它是否有效。如果没有,只需使用新代码编辑您的问题。
  • 在 OP 中发布整个 LinkedList 类
  • @Bob 你能发布你的 setLink 方法吗?我只是想看看。
  • 我做到了。它在节点类下:)
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多