如何反转循环单链表

时间:2013-01-08 06:07:04

标签: reverse circular-list

反转单个链表很容易,以下代码可以正常工作。

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;
}

但它不起作用,我想在运行此函数后,循环列表将是非循环的,实际上,在转储之后,我发现它仍然是一个循环列表。 我必须在其中制作错误的逻辑,请告诉我。

4 个答案:

答案 0 :(得分:1)

像Amit一样,我不太明白你的代码背后的想法...但从纯粹的逻辑观点来看,如果你已经知道如何打开常规列表,你最好的选择是复制所有的圆形列表中的元素列入一个带有“for”的新常规列表,当第一个元素等于当前元素时停止,然后使用代码转换新列表以反转单个链接列表。

答案 1 :(得分:0)

我不知道为什么你说反转单个链表的代码很好。对我而言看起来不对劲。这条线    cur-> next = list-> next; 如果你已经在循环外的NULL旁边设置了list->,它会不会将第二个节点的下一个指针设置为NULL?它不应该转到第一个节点吗?

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

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

答案 2 :(得分:0)

这是一种方法;

$html = str_get_html($str_html);
if(!is_object($html)) { 
    //Log error or return error
    return false;
}

$legend=$html->find('div.mainpage',0)->children(6);
if(!is_object($legend)) { 
    //Log error or return error
    return false;
}

}

答案 3 :(得分:-1)

它不是一个循环链表,但这种方法可能对你有所帮助:

//function to reverse the list
void reverse_list() {
    struct node *current, *prev, *next;
    current = head;
    prev = head;
    while (prev->next != head) {
        prev = prev ->next;
    }
    while (current->next != head) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    next = current->next;
    current->next = prev;
    prev = current;
    current = next;
    head = prev;
}