LinkedList为什么我们要在这里创建假人?

时间:2017-01-14 20:38:22

标签: 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;
}

为什么我们必须在这里创建假人?

如果你可以帮我解决这个问题,那将会很有帮助。当你必须在链表上执行某些操作时,我已经观察到了类似的步骤。

2 个答案:

答案 0 :(得分:1)

如果要在链表中交换两个节点,则需要更改前一节点中的next指针。

例如,您有一个列表A->B->C,并且想要交换BC,您需要更改 all <中的next指针/ em>这些节点。

但是,如果要交换第一个两个节点,则需要更改这两个节点中的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;
}

答案 1 :(得分:-2)

根本不需要添加虚拟节点。事实上,你通过添加虚节点作为头来改变链表的头部。你的代码应该没有虚节点。

public void swapPairs(ListNode head) {

    if(head!=null) {
      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;
      }
    }
}