java - LinkedList 为什么我们必须在这里创建虚拟对象?

标签 java algorithm linked-list

我是解决与数据结构相关的算法的新手,我不确定遇到问题的以下代码:

public ListNode swapPairs(ListNode head) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;

    head = dummy;
    while (head.next != null && head.next.next != null) {
        ListNode n1 = head.next, n2 = head.next.next;

        head.next = n2;
        n1.next = n2.next;
        n2.next = n1;                   
        head = n1;
    }
    return dummy.next;
}

为什么我们必须在这里创建虚拟对象?

如果你能帮我解决这个问题,那将是一个很大的帮助。当您必须对链表执行某些操作时,我观察到类似的步骤。

最佳答案

如果你想交换链表中的两个节点,你需要改变那些节点前一个节点的next指针。

比如你有一个列表A->B->C,你想交换BC,你需要更改所有这些节点中的 next 指针。

但是,如果您想交换 first 两个节点,则需要更改这两个节点中的 next 指针,指向列表头部的指针。

所以,你要做的事情取决于你是否在列表的开头交换......但是你的函数的作者很懒,他不想写两个不同的各种交换码。

先生。因此,懒惰的程序员在他必须交换所有内容之前就陷入了一个虚拟节点。这样他就不必在开始时交换任何东西,并且他可以对所有交换使用相同的代码。他在最后删除了这个节点,所以没有造成任何伤害。

在 Java 中创建虚拟节点并不昂贵,但我不会这样做。

我会这样写出两种方式:

public ListNode swapPairs(ListNode head) {
    
    if (head != null && head.next != null) {

        //swap first 2 nodes
        ListNode n1 = head;
        ListNode n2 = n1.next;

        head = n2;
        n1.next = n2.next;
        n2.next = n1;                   
        ListNode pred = n1;

        //swap remainder
        while (pred.next != null && pred.next.next != null) {
            n1 = pred.next;
            n2 = n1.next;

            pred.next = n2;
            n1.next = n2.next;
            n2.next = n1;                   
            pred = n1;
        }
    }
    return head;
}

关于java - LinkedList 为什么我们必须在这里创建虚拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654756/

相关文章:

java - Boolean/boolean 如何作为 Java 中 HashMap 的键?

java - 如何从创建的单选按钮类的实例中获取文本

algorithm - 如何将 3D 形状近似为网格?

java - 验证 spring 上下文而不刷新它

java - 如何在jSTL中使用正则表达式?

php - 在 php 中对 Knapsack 算法添加限制

python - 如何在Python中找到素数

linked-list - 两个和 Leetcode Rust 解决方案?

c++ - 在没有互斥锁的情况下并发追加到列表尾部

c - 链表 A 绑定(bind)到另一个 B 又绑定(bind)回 A