以下函数将列表中的第一个节点与第二个节点交换,并返回指向已编辑列表前面的指针。如果原始列表包含的节点少于两个,则不进行任何更改,并返回指向列表前面的原始指针。
这个功能是由一位教授写的,但我很难理解他为什么设置
list->next = newFront->next
。
我知道他创建了一个新指针,它等于第二个节点的地址,而新创建的指针的下一个将等于第一个节点的地址,但为什么有必要在第二个节点的地址中设置第二个节点的地址。原始列表等于newFront->next
:list->next = newFront->next
。这一步甚至是必要的吗?
以下是整个代码:
struct node {
int data;
struct node *next;
};
struct node* swapFirstTwo(struct node* list) {
if(list == NULL || list->next == NULL) return list;
struct node* newFront = list->next;
list->next = newFront->next;
newFront->next = list;
return newFront;
}
答案 0 :(得分:2)
设置list->next = newFront-next
可确保列表中的第三个元素(如果有的话)以及所有后续元素与list
正确链接,后者已成为第二个元素。
假设列表中最初有3个元素element1
,element2
和element3
。您的列表如下所示:
element1 => element2 => element3
您设置newFront = list->next
,element2
,list = element1
,有效地将element2
移至开头。然后,为防止element3
“脱落”,您需要将element1->next
设置为element2->next
(现在与newFront->next
相同)以获得以下内容:
element2 (i.e. newFront) => element3
element1 (i.e. list) => element3
这意味着现在将在列表中排名第二的元素(element1
a.k.a。list
)正确指向列表中的第三个元素。唯一剩下的就是在列表中实际设置element1
第二项,这可以通过将newFront->next
设置为list
来实现,实际上是element1
。所以你现在有:
element2 (i.e. newFront) => element1 (i.e. list) => element3
请注意,无论element3
链接到哪个都不受影响,所以即使列表中有四个或更多元素,这仍然可以正常工作。
答案 1 :(得分:0)
list
是列表中的(原始)第一项,newFront
是(原始)第二项。分配
list->next = newFront->next
获取指向列表中第三个项的指针,并将其存储到以前是第一个项目的位置,因为它现在将成为第二个项目。如果没有这一步,你最终会将两个节点指向对方,并且列表的其余部分将会丢失。