c:链表:如何编写节点交换函数?
以下是我的功能:c:链表:如何编写节点交换函数?,c,linked-list,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 switchnodes(NODE **A) { if((*A)->next) { NO
void switchnodes(NODE **A)
{
if((*A)->next)
{
NODE *first = pop(A);
NODE *second = pop(A);
push(A,first);
push(A,second);
}
}
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);
}
}
推送和弹出:
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*top
my链表包含值1…10
NODE*holder
是另一个指针,分别指向链表的第5个和第4个节点
switchnodes(&holder)代码>指向第5个节点的保持架。第6个节点丢失
switchnodes(&(holder->next))代码>指向第四个节点的保持架。第5和第6个节点已成功交换
为什么会这样
我如何编写这个函数,这样就不必传递指针->下一步?我不能在每个实例中都这样做,比如如果它是我需要交换的顶级节点。这就是列表的工作方式:只能通过next
指针交换节点<代码>持有者
是列表外的指针。它可能会更新,但列表不会知道
假设holder
指向第四个节点。交换后,它现在指向新的第4个节点,即前第5个节点。但重要的是:列表第三个节点的next
指针仍然指向第四个节点,即交换前的第四个节点
通过为每个节点提供一个haed和一个tail以及一个额外的prev
指针,您可以双向创建列表。然后,您可以使用该信息更新交换节点的邻居(如果有)。您必须在switchnodes功能中更新first的“next”。以下是一个工作函数:
void switchnodes(NODE **A)
{
if((*A)->next)
{
NODE *first = pop(A);
NODE *second = pop(A);
push(A,first);
push(A,second);
}
}
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);
}
}
要问的第一个问题是,是否必须交换节点而不是它们的值?此函数不适用于我。我完全按照OP中的描述使用