>我有这个链表
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;
更改链表中两个节点的最有效方法是什么?
你的问题有点不够明确; 如果要交换的元素多次出现,会发生什么?
假设可以只交换第一个实例,我肯定会编写代码来分两步完成:
- 找到保存要交换的数据的元素。
- 交换它们。
也许是这样的:
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;
}
}
如果有重复项,这将简单地交换两个首先找到的实例。