转换链表

时间:2016-10-28 04:31:03

标签: c algorithm data-structures linked-list

我是初学者并试图反转链表,所以在这里我写了一个函数来反转链表。

void reverse_list(struct node **head_ref)
{
    struct node *temp = *head_ref;
    if(temp == NULL)
        return;
    else if(temp->next == NULL)
        return;
    else
    {
        struct node *temp_r = temp;
        int count = count_list(temp); // no.of nodes in the list
        while(temp != NULL)
        {
            struct node *temp_t = temp_r;
            int i;
            for(i=0;i<count;i++)
            {
                if(i!=0)
                    temp_t = temp_t->next;   // loop to find the node which is to be swapped with temp
            }
            if(temp_t == temp)    // base condition to stop swapping
                return;
            else
            {
                swap_node(&temp_r,temp->data,temp_t->data);
            }
            temp = temp->next; // traverse through the list
            count--; 
        }
    }
}

我使用的逻辑:我想通过以这种方式(1,n),(2,n-1),(3,n-3)交换节点来反转链表。 。

但是当我执行此代码时,它只打印列表的第一个元素。

运行调试器后,我明白我制作了原始列表的两个副本,我实际上交换了两个不同列表的节点,这是代码中定义的函数swap_node()无法实现的,这里是{{ 1}}功能

swap_node()

我想使用上面的逻辑反转链接列表,但我无法做到这一点,所以请有人帮助我实现这一点,我如何改进此代码以及如何继续。

提前。

2 个答案:

答案 0 :(得分:1)

您的问题在while循环中:

您不需要节点数,因为while知道遍历列表。

另外,正如您已经知道的那样,应该有3个指针(前一个,当前一个和下一个)。

所以你的代码最终看起来像这样:

void reverse_list(struct node **head_ref) {
    if(*head_ref == NULL || (*head_ref)->next == NULL)
        return;

    struct node *temp = *head_ref;
    struct node *next = NULL;
    struct node *pre = NULL;

    while(temp != NULL)
    {
        next = temp->next;
        temp->next = pre;
        pre = temp;
        temp = next;    
    }
    *head_ref = pre;
}

注意如何更新列表的(原始)头部以指向相反的部分。

答案 1 :(得分:0)

实际上,您使用的算法太复杂用于反转链接列表。

while(currx && currx->data != key1)
{//btw, these code may cause bugs if there are some same value in the linked list
    prevx = currx;
    currx = currx->next;
}

上面的代码显示您并不真正了解链接列表的本质,在这些代码中,您只需处理链接列表,就像它是一个数组一样。这将使您的代码运行得非常缓慢,应该避免使用。

更好,更快地反转链表的方法如下:

struct Node
{
    int dataa;
    struct Node* next;
};
typedef struct Node* node;//some definition
node head = NULL;//global variables is not recommended in writing code ,but here it just make the code easier to read .

//Here you should do something to create the linked list

//eg: the linked list is 1 2 3 4 5 now ,the head pointer points at 1
void reverse(void)
{
    if (head != NULL)
    {
        node temp1 = head->next;
        node temp2 = head->next;
        head->next = NULL;
        while (temp2 != NULL)
        {
            temp2 = temp2->next;
            temp1->next = head;
            head = temp1;
            temp1 = temp2;
        }
    }
}
//now it will be 5 4 3 2 1 ,the head pointer points at 5

只需逐个从头到尾反转列表。