当前位置: 首页 > 知识库问答 >
问题:

链表。头尾参照

慕宏峻
2023-03-14

我正在尝试为我的链表类创建一个添加和删除方法。我写了两封信,名字是Head和Tail。

头-

当我试图删除特定节点时,我一直遇到问题,因为Java说我越界了。我想是因为我的头没有指向第一个节点?你们觉得怎么样?还是我完全走错路了...

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个答案

潘翰藻
2023-03-14

我认为这是因为你的从不链接到任何东西。我要做的是在你的add方法中,检查你列表的size;如果是0,将head设置为新元素,并将尾部等于head。如果是1,将head链接到新节点,并设置end。如果是2,只需设置尾部到新节点的链接,并设置尾部(就像现在一样)。

另外,我不确定您是如何实现它的,但是newNode。setLink(尾部) 似乎错了。。。tail应该链接到newNode。从外观上看,似乎您正在尝试创建newNode-

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

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

华涵意
2023-03-14

看起来您在设置初始(空)链接列表时没有从头到尾初始化链接。

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

现在是战略实施阶段。从一个head开始(最初为null)。

  1. 若要添加节点,请沿着链接列表向下走,直到找到空的下一个链接。将其替换为节点,并将节点转发链接设置为null。(提高效率,使尾部始终具有链接列表中的最后一个节点,如果列表中没有任何节点,则为null)

这有用吗?

请查看此链接以获取完整描述!

 类似资料:
  • 问题内容: 我需要用Java编写一个将链表中的第一个元素移动到最后位置的方法。 为此,我相信我必须设置一个节点以引用head之后的第一个元素,然后将下一个节点设置为null。我尝试使用我的方法执行此操作,但是在运行该方法时,输出不正确。 我所剩的班级太多了,无法在此处发布,但是我认为我只需要在概念化如何将第一个元素移到列表末尾方面提供帮助。 我写的方法是: 问题答案: 您要删除列表的开头并使其成为

  • 题目链接 牛客网 题目描述 从尾到头反过来打印出每个结点的值。 解题思路 1. 使用递归 要逆序打印链表 1->2->3(3,2,1),可以先逆序打印链表 2->3(3,2),最后再打印第一个节点 1。而链表 2->3 可以看成一个新的链表,要逆序打印该链表可以继续使用求解函数,也就是在求解函数中调用自己,这就是递归函数。 // java public ArrayList printListFro

  • 一、题目 输入个链表的头结点,从尾到头反过来打印出每个结点的值。 二、解题思路 使用栈的方式进行。 将链表从头到尾压入栈内,出栈的过程就对应着从尾到头。 三、解题代码 public class Test { /** * 结点对象 */ public static class ListNode { int val; // 结点的值

  • 如果你想创建一个像这样的单链表: 这个列表有方法“追加”、“删除”、“printList”和“findElement”。有必要有尾巴吗?因为使用“最后”你可以地址最后一个节点。 那么,什么时候有必要拥有所有三个节点“头”、“尾”和“最后”?例如,当您想将排序的节点插入列表时?

  • 我已经在这上面困了半天了。我可以得到一些提示或指针,如何交换一个链表的头部和尾部(而不是反转整个列表),而不复制他们的数据吗? 如果我能看到代码并对它有一个解释,那就太棒了! 编辑: null 通过列表查找列表的第二个最后节点,并将其链接到头部。 将原来的头部链接到null,就像现在一样,头部应该被交换到尾部。

  • 我必须为我的项目实现一个单链表,我很难让删除方法工作。我在这里搜索了答案,但我找不到任何包含尾巴参考的答案。我的项目需要在列表中有一个头和尾引用,并且需要在任何必要的地方更新。这是我的类和删除方法: } 我已经经历了很多次这种方法的迭代,每次我要么丢失头部引用,要么丢失尾部引用,要么不删除元素,我都被难住了。作为参考,这里是我正在运行的测试。我甚至没有考试不及格,它只是说不及格。 编辑:忘记提到删