首页 > 解决方案 > 成对交换链表

问题描述

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,但如果没有代码,我不确定不管这是一个愚蠢的问题,还是我没有注意任何重要的事情。谢谢

标签: c#singly-linked-list

解决方案


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

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

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

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

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

推荐阅读