成对交换链表
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
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