交换循环双向链表中的第一个和第二个节点

问题描述 投票:0回答:1

这让我发疯。绝对疯狂。我的节点结构是这样的:

typedef struct  s_num
{
    int             num;
    struct s_num    *prev;
    struct s_num    *next;
}   t_num;

以下

swap
功能显然不起作用:

void    swap(t_num **head)
{   
    t_num   *first;
    t_num   *second;
    t_num   *last;

    first = *head;
    second = (*head)->next;
    first->prev = second;
    first->next = second->next;
    second->next->prev = first;
    second->next = first;
    last = find_last_node(head);
    last->next = second;
    second->prev = last;
    *head = last->next;
}

辅助函数

find_last_node(t_num **head)
编写如下:

t_num   *find_last_node(t_num **head)
{
    t_num   *curr;

    if (!*head)
        return (NULL);
    return ((*head)->prev);
}

我真的在试图解决这个问题时失去了理智。我知道这些类型的链表是如何工作的,但是为什么列表的其余部分总是丢失,这是没有意义的。我使用旋转功能,它基本上将头部向后/向前移动一个节点,并且它不会妨碍列表的打印。请帮我理解。

我尝试交换循环双向链表的头和第二个元素,但这实际上导致了其他节点丢失。

c debugging linked-list nodes
1个回答
0
投票

find_last_mode
返回
(*head)->prev
。在调用它的地方,
*head
first
相等,因此它返回
first->prev
first->prev
second
。所以
last = find_last_node(head);
实际上是
last = second;
,接下来是
second->next = second;
second->prev = second
,这不是你想要的。您需要在更改
last
之前设置
first->prev

© www.soinside.com 2019 - 2024. All rights reserved.