如何在 C 语言中交换链表中的两个节点?



>我有这个链表

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;

更改链表中两个节点的最有效方法是什么?

你的问题有点不够明确; 如果要交换的元素多次出现,会发生什么?

假设可以只交换第一个实例,我肯定会编写代码来分两步完成:

  1. 找到保存要交换的数据的元素。
  2. 交换它们。

也许是这样的:

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;
}
}

如果有重复项,这将简单地交换两个首先找到的实例。

相关内容

  • 没有找到相关文章

最新更新