我有这个链表
struct Link
{
frame_t *frame;
struct Link *next;
};
现在我想用函数swap()替换它的两个节点,所以例如swap(list,4,7)会给我
[1, 2, 3, **7**, 5, 6, **4**, 8, 9, 10]
表示列表中包含
的内容[1, 2, 3, **4**, 5, 6, **7**, 8, 9, 10]
我尝试做的是在实际需要替换的节点之前使用节点,但是我得到了无限循环和已被剪切的节点。
link_t* tmp = currPrev->next;
link_t* tmpTwo = linkToChangePrev->next;
tmpTwo->next = tmp->next;
currPrev->next = tmpTwo;
tmp->next = tmpTwo;
linkToChangePrev->next = tmpTwo;
更改链接列表中两个节点的最有效方法是什么?
答案 0 :(得分:1)
你的问题有点不明确;如果要交换的元素出现多次会发生什么?
假设只交换第一个实例是可以的,我肯定会编写代码来分两步完成:
也许是这样的:
const struct Node * find_node(const struct Node *list, frame_t *value)
{
while(list != NULL)
{
if(list->frame == value)
return list;
}
return NULL;
}
void swap(struct Node *list, frame_t *value1, frame_t *value2)
{
struct Node *el1 = (struct Node *) find_node(list, value1);
struct Node *el2 = (struct Node *) find_node(list, value2);
if(el1 != NULL && el2 != NULL)
{
const frame_t * const f1 = el1->frame;
el1->frame = el2->frame;
el2->frame = f1;
}
}
如果存在重复项,这将简单地交换两个首先找到的实例。