c:链表:如何编写节点交换功能?

时间:2014-01-23 13:56:38

标签: c linked-list

这是我的功能:

void switchnodes(NODE **A)
{
    if((*A)->next)
    {
        NODE *first = pop(A);
        NODE *second = pop(A);
        push(A,first);
        push(A,second);
    }
}

推送和弹出:

void push(NODE **top,NODE *nnew)
{
    nnew->next=*top;
    *top=nnew;
}
NODE * pop(NODE **top)
{
    NODE *remove = *top;
    *top=(*top)->next;
    remove->next=0;
    return remove;
}

我的困惑:

NODE:

typedef struct node {
    int value;
    struct node *next;
} NODE;

NODE * top我的链表保持值1 ... 10 NODE * holder是指向链表的第5和第4个节点的另一个指针

switchnodes(&holder);持有人指向第5个节点。第6个节点丢失了 switchnodes(&(holder->next));持有者指向第4个节点。第5和第6个节点成功交换。

为什么会这样?

如何编写此函数,以便我不必传递指针 - >下一步?我不能在每个实例中都这样做,比如它是我需要交换的顶级节点。

2 个答案:

答案 0 :(得分:1)

这就是你的列表的工作方式:你只能通过next指针交换节点; holder是列表外的指针。它可能会更新,但列表不会知道。

holder指向第4个节点。你交换它,它现在指向新的第4个节点,前5个节点。但重要的是:列表第三个节点的next指针仍然指向第4个节点 - 交换前的第4个节点。

您可以通过为每个节点添加haed和tail以及额外的prev指针来使列表成为双向。然后,您可以使用该信息更新交换节点的邻居(如果有)。

答案 1 :(得分:1)

你必须在switchnodes函数更新第一个“下一个”。这是一个工作职能:

void switchnodes(NODE **A)
{
    if((*A)->next)
    {
        NODE *first = pop(A);
        NODE *second = pop(A);  
        push(A,first);
        first->next = second->next; //the missing line
        push(A,second);
    }
}