【问题标题】:reversing a doubled linked list without using any extra pointer在不使用任何额外指针的情况下反转双向链表
【发布时间】:2020-04-09 13:28:12
【问题描述】:

我试图在不使用任何额外指针的情况下反转一个双链表。我只有指向我的双链表的第一个节点的头指针。

这是我反转链表的函数:

int reverse(){
if(head==NULL || head->next==NULL){
    return 0;
}
else{
    head->prev=head->next;
    head->next=NULL;
    head->prev->prev=head->prev->next;
    head->prev->next=head;
    head=head->prev;
    while(head->prev==NULL){
        head->prev->prev=head->prev->next;
        head->prev->next=head;
        head=head->prev;
    }
}}

如果我的链表有数据 1,2,3,4,5 并且在运行反向函数之后,当我尝试显示数据时,我得到输出:2,1(而不是 5,4, 3,2,1)

【问题讨论】:

  • if(head==NULL && head->next==NULL)head 为 NULL 时,这将导致 NULL 指针访问。你可能想要|| 而不是&&
  • 为什么不迭代你的列表交换nextprev,当你完成后,交换headtail
  • @DavidC.Rankin 我认为挑战在于在不使用任何额外指针的情况下做到这一点。不确定这是硬性要求还是 OP 出于某种原因认为是个好主意。
  • 您总是可以使用 XOR hack 进行交换,然后按照 prev 指针进行迭代。
  • @user3629249 我在结构中定义了head 我唯一的错误是在while 语句while(head->prev==NULL) 中更正错误后我的程序编译并正常工作

标签: c linked-list doubly-linked-list


【解决方案1】:

while 语句有错误while(head->prev==NULL) 正确的代码是while(head->prev!=NULL)

所以函数的正确代码是:

int reverse(){
if(head==NULL || head->next==NULL){
    return 0;
}
else{
    head->prev=head->next;
    head->next=NULL;
    head->prev->prev=head->prev->next;
    head->prev->next=head;
    head=head->prev;
    while(head->prev!=NULL){
        head->prev->prev=head->prev->next;
        head->prev->next=head;
        head=head->prev;
    }
}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多