将链接列表的头部换成链接吗?

时间:2018-08-22 10:29:19

标签: c function linked-list singly-linked-list

为了澄清标题:我像*head=(*head)->next那样遍历链接列表,因为它是一个函数。在我的函数中,我选择了 current head以及 current head和要交换的列表末尾之间的另一个链接。

我想要做的是一个知道知道所有交换条件都将交换head和链接(不仅是数据)的函数;表示链接不是当前的head或链接不是NULL。可以那样做还是我必须尝试其他事情?

谢谢。

由于我的问题不清楚,请给您问题。

我需要做一个这样的功能:

void intertwine(cvor **head)

我收到一个带有随机数的链表。我需要做的是交换链接,直到看起来像这样:数量不均,偶数,不均等。

我必须尊重不均匀甚至均匀的顺序。

如果没有相等的均匀度和不均匀度,请按照它们在列表中的顺序排列。

这是2个示例:

输入:11、7、5、16、12、15、17、13、10、4、1

输出:11、16、7、12、5、10、15、4、17、13、1

输入:1、3、2、4

输出:1、2、3、4

我当前的代码如下(未完成

edit2:很抱歉,忘记了语言障碍

typedef struct atom{
    int el;
    struct atom *next;
} cvor;

void intertwine (cvor **head){
    cvor *pom,int br=1;

    pom=*head;
    while(*head){
        if((*head)->el%2==(br%2)){
            pom=(*head)->next;
            while(pom){
                if(pom->el%2==(br+1)%2)break;
                pom=pom->next;
            }
            if(pom==NULL) return;

最后是我想要的交换发生的时间。

1 个答案:

答案 0 :(得分:0)

如果编写一个函数,该函数可以将链接列表中的一个元素移到同一链接列表中的另一个元素之前,则可以解决此问题。

该功能应为输入

  • 指向x指针的指针'

  • 指向要移动的元素的指针b

  • 指向元素a的指针,元素b将被移到

喜欢

(1.6666666666666667, 1.8503717077085944e-14)

调用该函数时需要

  • headvoid move_b_in_front_of_a(cvor **head, cvor* b, cvor* a) { ... } 都指向列表a

  • 中的元素
  • 列表中的b位于*head之前

实现可能是这样的:

a

在上面的代码中,我使用了函数

b

您需要实现的。

拥有这两个功能时,应该很容易实现void move_b_in_front_of_a(cvor **head, cvor* a, cvor* b) { // Find the element just before a cvor* a_prev = find_element_before(head, a); // Find the element just before b (start from a) cvor* b_prev = find_element_before(a, b); if (b_prev == NULL) { .... add error handling ....} // Take b out of the list b_prev->next = b->next; // Insert b in front of a if (a_prev == NULL) { (*head) = b; } else { a_prev->next = b; } b->next = a; } 函数。

以下是该函数的一些伪代码,可能会让您入门:

cvor* find_element_before(cvor* l, cvor* e)
{
  // Add code to find the element just before e in the list l
  // Return NULL if e is first element
  // Add error handling if element e isn't found

  ...
  ...

  return pointer_to_element_just_before_e;
}