反转单个链表很容易,以下代码可以正常工作。
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;
}
但它不起作用,我想在运行此函数后,循环列表将是非循环的,实际上,在转储之后,我发现它仍然是一个循环列表。 我必须在其中制作错误的逻辑,请告诉我。
答案 0 :(得分:1)
答案 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;
}