成对交换链表

Swap Linked list pairwise

public ListNode SwapPairs(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }

        var newHead = head.next;
        ListNode a = head; 
        ListNode b = head.next;
        ListNode prev = null;

        while(a != null && b != null) {
            a.next = b.next;
            b.next = a;

            if(prev != null)    
                prev.next = b;
            if(a.next == null)
                break;
            b = a.next.next;
            prev = a;
            a = a.next;
        }

        return newHead;
    }

这段代码来自 leetcode,这个可以工作,但我不明白的是这段代码中 prev 变量的使用,我们没有将 prev 的任何值分配给 a 或 b,但如果没有它,代码就会起作用,我不确定这是一个愚蠢的问题还是我没有注意任何重要的事情。谢谢

prev不需要分配给任何变量。我们正在使用它来跟踪 a 并更新引用的 next 属性。它用于确保之前的交换链与当前交换正确连接。

例如,在第 2 次迭代中,我们要确保 1.next 指向 4 而不是像第 1 次迭代中那样指向 3。这可以通过跟踪对当前对 prev 的前一个元素的引用并通过引用更新 prev.next 来完成。

Original:
1 -> 2 -> 3 -> 4 -> NULL

1st Iteration:
2 -> 1 -> 3 -> 4 -> NULL

2nd Iteration:
2 -> 1 [->] 4 -> 3 -> NULL