2011-12-16 73 views
2

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

此功能由教授撰写,但我无法理解他为什么设置
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; 
} 
+0

你已经理解了这个零或一个元素的列表:现在只需绘制出两个和三个元素的列表,并通过它。在纸上做起来更容易,所以我不会用ASCII艺术杀死自己,除非你仍然无法得到它。 – Useless 2011-12-16 13:25:06

回答

2

设置list->next = newFront-next确保在列表中的第三元件(如果有的话),因此所有以下元素,被正确地与list联,这已成为第二个元素。

假设最初有3个元素在列表中,element1,element2element3。你的名单看起来是这样的:

element1 => element2 => element3 

您可以设置newFront = list->next,这是自list = element1element2,从而有效地移动element2到开始。然后,为了防止element3“脱落”,需要设置element1->nextelement2->next(也就是现在的一样newFront->next)得到以下:

element2 (i.e. newFront) => element3 
element1 (i.e. list) => element3 

这意味着,现在要去的元素是第二次在该列表(element1又名list)正确地指向列表中的第三个元素。剩下的唯一东西就是实际制作element1列表中的第二项,通过设置newFront->nextlist(实际上是element1)来实现。所以,你现在有:

element2 (i.e. newFront) => element1 (i.e. list) => element3 

注意,无论element3链接不受影响,所以这仍然工作得很好,即使有列表中的四个或更多的元素。

+0

感谢您的详细解释。它现在变得更有意义了 – kachilous 2011-12-16 14:49:08

0

list是列表中的(原始)第一项,newFront是(原始)第二项。指定
list->next = newFront->next获取指向列表中第三个项目的指针,并将其存储到过去是第一个项目的项目中,因为它现在将成为第二个项目。没有这一步,你最终会得到两个节点彼此指向,列表的其余部分将会丢失。