手动将节点添加到列表与使用 addNode 方法有什么区别?

我注意到可以使用两种不同的方法在链表中插入节点。有些人使用以下几行代码:

Node head = newNode(3);
head.next = newNode(5);
head.next.next = newNode(8);

使用以下方法:

static Node newNode(int data)
{
    Node new_node = new Node();
    new_node.data = data;
    new_node.next = null;
    return new_node;
}

而其他人使用以下代码行:

sList.addNode(2);  
sList.addNode(2);  
sList.addNode(3);  

使用以下方法:

public void addNode (int data) {
        Node newnode = new Node(data);
        if (head == null) {
            head = newnode;
            tail = newnode;
        } else {
            tail.next = newnode;
            tail = newnode;
        }
        size++;
    }

我不知道什么时候用第一种技术,什么时候用第二种。

rmb001 回答:手动将节点添加到列表与使用 addNode 方法有什么区别?

在高性能应用中这是首选:

Node head = new Node(3);
size++;
head.next = new Node(5);
size++;
head.next.next = new Node(8);
size++;

Node tail = head.next.next;

这样做可以避免进行额外的方法调用,如果它没有内联,则可能会产生开销。此外,addNode 方法包含完全避免这样做的额外检查。缺点是程序员要确保他们记得给 List 一个头、尾,并在添加节点时增加大小。

总结:这使用较少的计算资源,但需要更多的程序员努力。它使代码更难理解。


如果此 List 类用于库,那么 addNode 方法是可行的方法:

sList.addNode(2);  
sList.addNode(2);  
sList.addNode(3);

类的用户将调用 addNode 并且该方法会为他们处理一切,他们不必确保有一个 List 头、尾,并且大小正确增加。它只是有效,用户没有办法把它搞砸。

总结:这会使用更多的计算资源,但减少了程序员在填充列表时可能犯的错误数量。它使代码更易于理解。

,

第一个模式只使用了一个 Node 类,而第二个模式也需要一个 LinkedList 类。第一个是轻量级的,第二个对于实际的生产使用更有用。第二种策略的优点:

  • 添加更多项目并不麻烦。想象一下,当您必须创建一个包含 100 个项目的列表时,代码的第一个版本。
  • 可以有一个表示空列表的 LinkedList 实例。 Node 实例表示至少一个节点的列表,除非使用某些特殊值来表示“哨兵”节点。
  • 它允许方法改变列表的 headsize,而调用者不必自己保留这些信息。

您可以进一步扩展 LinkedList 类,以便构造函数已经可以获取数据。 Java 中还有一个有趣的 varargs 特性,所以你可以这样做:

class LinkedList {
    Node head = null,tail = null;
    int size = 0;
    
    LinkedList(int... data) {
        add(data);
    }

    public void add(int... data) {
        for (int value : data) {
            if (head == null) {
                tail = head = new Node(value);
            } else {
                tail = tail.next = new Node(value);
            }
        }
        size += data.length;
    }

    /* ...Other methods... */
}

现在你可以写:

LinkedList lst = new LinkedList(1,2,3);

或:

int[] a = {1,3};
LinkedList lst = new LinkedList(a);

这是一个见仁见智的问题,但这使得使用链表成为一种乐趣。

本文链接:https://www.f2er.com/12836.html

大家都在问