编写链表功能

时间:2011-12-16 13:20:02

标签: c linked-list

以下函数将列表中的第一个节点与第二个节点交换,并返回指向已编辑列表前面的指针。如果原始列表包含的节点少于两个,则不进行任何更改,并返回指向列表前面的原始指针。

这个功能是由一位教授写的,但我很难理解他为什么设置 list->next = newFront->next

我知道他创建了一个新指针,它等于第二个节点的地址,而新创建的指针的下一个将等于第一个节点的地址,但为什么有必要在第二个节点的地址中设置第二个节点的地址。原始列表等于newFront->nextlist->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;
}

2 个答案:

答案 0 :(得分:2)

设置list->next = newFront-next可确保列表中的第三个元素(如果有的话)以及所有后续元素与list正确链接,后者已成为第二个元素。

假设列表中最初有3个元素element1element2element3。您的列表如下所示:

element1 => element2 => element3

您设置newFront = list->nextelement2list = 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获取指向列表中第三个​​项的指针,并将其存储到以前是第一个项目的位置,因为它现在将成为第二个项目。如果没有这一步,你最终会将两个节点指向对方,并且列表的其余部分将会丢失。