如何在C中链接列表中的两个节点?

时间:2017-07-04 09:58:40

标签: c linked-list

我有这个链表

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 个答案:

答案 0 :(得分:1)

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

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

  1. 找到保存数据的元素以进行交换。
  2. 交换它们。
  3. 也许是这样的:

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

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