【问题标题】:How to reverse a circular single linked list如何反转循环单链表
【发布时间】:2013-01-08 06:07:04
【问题描述】:

单链表逆向很容易,下面的代码可以正常工作。

void reverse_list (SLINK list)
{
    SLINK tmp = list->next; 
    NODE *cur = NULL;
    list->next = NULL;
    for (; NULL != tmp;)    
    {
            cur = tmp;
            tmp = tmp->next;
            cur->next = list->next;
            list->next = cur;
    }
}

如何反转循环单链表?我把代码调整到这个

SLINK reverse_list (SLINK rear)
{
    NODE *tag = rear->next;
    SLINK tmp = rear->next;
    NODE *cur = NULL;
    rear->next = NULL;
    for (; NULL != tmp; )
    {
        cur = tmp;
        tmp = tmp->next;
        cur->next = rear;
        rear->next = cur;
    }
    rear = tag;
    return rear;
}

但它不起作用,我以为运行这个函数后,循环列表会是非循环的,实际上,转储它后,我发现它仍然是一个循环列表。 一定是我逻辑错了,请指正。

【问题讨论】:

标签: c++ c reverse circular-list


【解决方案1】:

像 Amit 一样,我不太了解您的代码背后的想法...但是从纯粹逻辑的角度来看,如果您已经知道如何翻转常规列表,那么最好的选择是复制所有将循环列表中的元素转换为带有“for”的新常规列表,当第一个元素等于当前元素时停止,然后使用您的代码翻转新列表以反转单链表。

【讨论】:

    【解决方案2】:

    不知道你为什么说单链表的逆向代码没问题。在我看来,它看起来不对。线 当前->下一个=列表->下一个; 鉴于您已经在循环外将 list->next 设置为 NULL,它不会将第二个节点的 next 指针设置为 NULL 吗?不是应该去第一个节点吗?

    为什么你期望循环链表的反转会导致线性链表?如果您要在一张纸上绘制圆形列表,则反转只会导致链接方向顺时针到逆时针(或反之亦然)偏移。

    循环列表反向和线性列表反向之间唯一的逻辑变化是,在循环链表的情况下,您不会将第一个节点的 next 指针设置为 NULL

    【讨论】:

    • 我测试的列表带有标题,行 cur->next = list->next;会将第一个节点的下一个指针设置为 NULL
    【解决方案3】:

    这是一种方法;

    node *toggle(node *start){
    
            node *p=NULL;
            node *c=start;
            node *ne=NULL;
            node *e;
            int f=0;
            do{
                ne=c->next;
                c->next=p;
                p=c;
                if(f==0){
                    e=p;
                    f=1;
                }
                c=ne;
            }while(c!=start);
    
            start=p;
            e->next=p;
    return start;
    

    }

    【讨论】:

    • 好吧,我使用了三个指针,p指向前一个元素,c指向当前元素,ne指向下一个元素,我们知道在循环列表中最后一个元素指向开始;所以我只是让当前元素指向前一个元素,然后让前一个 =current 和 current=next 直到我们当前返回到 start=现在是最后一个元素,因为前一个是当前元素之后它成为第一个元素;所以我只是让 start=p 和 e= 是最后一个元素现在指向 p;
    【解决方案4】:
    void reverse()
    {
        // reverse procedure same as reversing a
        // singly linked list
        struct node *p, *q, *r;
        p = first; // first is head node
        q = NULL;
        r = NULL;
        do
        {
            q = p->next;
            p->next = r;
            r = p;
            p = q;
        } while (p != first);
    
        // adjutsing the links so as to make the
        // last node point to the first node
        first->next = r;
        first = r;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-07
      • 2012-09-08
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多