我是新手解决与数据结构相关的算法,我不确定下面的代码我遇到了这个问题:
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;
}
为什么我们必须在这里创建假人?
如果你可以帮我解决这个问题,那将会很有帮助。当你必须在链表上执行某些操作时,我已经观察到了类似的步骤。
答案 0 :(得分:1)
如果要在链表中交换两个节点,则需要更改前一节点和中的next
指针。
例如,您有一个列表A->B->C
,并且想要交换B
和C
,您需要更改 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;
}
}
}