Java 在单链表上编写add方法哪种方式更好

Java 在单链表上编写add方法哪种方式更好,java,linked-list,Java,Linked List,我看到2个youtube视频显示了这样一个add-at-end方法 public void insertFirstLink(String bookName, int millionsSold) { Link newLink = new Link(bookName, millionsSold); newLink.next = firstLink; firstLink = newLink; } 这看起来很好,很干净,但我又学习了另一个教程 p

我看到2个youtube视频显示了这样一个add-at-end方法

public void insertFirstLink(String bookName, int millionsSold) {
        Link newLink = new Link(bookName, millionsSold);
        newLink.next = firstLink;
        firstLink = newLink;
    }
这看起来很好,很干净,但我又学习了另一个教程

public void insert(int x) {
        if (head == null) {
            head = new Node(x, head);
        } else {
            Node current = head;

            while (current.getNext() != null) {
                current = current.getNext();
            }
            Node newNode = new Node(x, null);
            current.setNext(newNode);
        }
    }
为什么我会使用第二个,因为它更长,遍历列表只是为了添加到末尾。我对链表还不熟悉,我不明白为什么这么多人写得不同,我看到的每个教程都使用了不同的技术。我主要学习这一点是为了能够回答面试问题,所以我需要了解所有的可能性


我也不清楚“头/当前/第一”节点是什么。在一个教程中,他提到头是添加的第一个节点,并成为下一个添加的节点,所以最终“头”节点是最后一个节点,对吗?当他打印他的清单时,它是相反的

第一个方法在当前位置插入一个节点(它似乎将该节点保持为指向列表末尾的指针)。第二个在末尾插入一个节点,但不保留尾部指针,因此它必须首先遍历列表,直到找到结束节点,然后将新节点放在那里


第一个版本或第二个版本是否“更正确”,更多地取决于您的特定软件需求。都是对的,;他们只是用不同的方式做同样的事情。虽然这个示例看起来特别简单,但当您尝试在跳过列表和二叉树之间进行选择时,它就不会那么简单了。

第一个方法在当前位置插入一个节点(它似乎将其作为指向列表末尾的指针来维护)。第二个在末尾插入一个节点,但不保留尾部指针,因此它必须首先遍历列表,直到找到结束节点,然后将新节点放在那里


第一个版本或第二个版本是否“更正确”,更多地取决于您的特定软件需求。都是对的,;他们只是用不同的方式做同样的事情。虽然这个例子看起来特别简单,但当您尝试在跳过列表和二叉树之间进行选择时,它就不会那么简单了。

第二种方法的原因是,通常假设add方法将元素放在列表的末尾。如果您玩,您将看到元素按添加顺序打印。ArrayList和LinkedList的行为必须相同

优化第二段代码的一种方法是存储一个指向列表尾部的指针和一个指向头部的指针,这样和两者都需要O(1)个时间。但是,如果排序在数据结构中无关紧要,那么应该使用第一种方法


编辑:为了澄清,对于“添加”,您必须使用第二种方法(或某些变体)才能将其作为添加,而对于“推送”,您必须使用与第一种方法类似的方法;但是没有理由你的类不能同时拥有这两种元素。

第二种方法的原因是,通常假设add方法将元素放在列表的末尾。如果您玩,您将看到元素按添加顺序打印。ArrayList和LinkedList的行为必须相同

优化第二段代码的一种方法是存储一个指向列表尾部的指针和一个指向头部的指针,这样和两者都需要O(1)个时间。但是,如果排序在数据结构中无关紧要,那么应该使用第一种方法


编辑:为了澄清,对于“添加”,您必须使用第二种方法(或某些变体)才能将其作为添加,而对于“推送”,您必须使用与第一种方法类似的方法;但是你的类没有理由不能同时拥有这两种方法。

这两种方法的作用不一样。第一种方法在第一个位置插入新元素,第二种方法将新元素添加到末尾。这两种方法的作用不同。第一个在第一个位置插入新元素,第二个将其添加到末尾。firstLink是根据教程添加的第一个或最后一个节点,这让我很困惑。如果我加上10个节点,firstLink将是我认为的第10个位置。从这个意义上说,它总是增加到最后,不是吗?。当你说外部状态时,你的意思是什么,你的意思是方法是节点的一部分,而不是保持“头部”位置的LinkedList类的一部分谢谢,我仍然没有100%完成,但正在接近。他们两个都会被添加到列表的“末尾”,对吗?如果一个面试官要求我做一个附加到结尾的方法,这两种方法都可以接受吗?我不明白你为什么说第一种方法会增加当前位置,当前位置不总是最后一个位置,因为头的值是最后一个增加值。90%的人会这样写吗?没有“x%的人会这样写。”这完全取决于你的软件需求。例如,如何将一个节点添加到没有尾部指针的单链接列表的末尾?我想我已经开始了解它了。第一个方法使用“tail”指针,每次向其添加节点时,该指针都会更改。第二种方法使用不变的“head”指针,因此必须遍历到末尾。firstLink是根据教程添加的第一个或最后一个节点,这让我很困惑。如果我加上10个节点,firstLink将是我认为的第10个位置。从这个意义上说,它总是增加到最后,不是吗?。当你说外部状态时,你的意思是什么,你的意思是方法是节点的一部分,而不是保持“头部”位置的LinkedList类的一部分谢谢,我仍然没有100%完成,但正在接近。他们两个都会被添加到列表的“末尾”,对吗?如果一个面试官要求我做一个附加到结尾的方法,这两种方法都可以接受吗?我不明白你为什么说第一种方法会增加当前位置,因为头部的值,当前位置不总是最后一个位置吗