这是我的功能:
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个节点成功交换。
为什么会这样?
如何编写此函数,以便我不必传递指针 - >下一步?我不能在每个实例中都这样做,比如它是我需要交换的顶级节点。
答案 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);
}
}