【发布时间】:2016-07-01 06:10:59
【问题描述】:
我有一个函数可以删除链表中的每三个节点:
void tricimate()
{
node * toDelete = head->next->next;
while (toDelete != NULL)
{
if (toDelete->next == NULL)
{
tail = tail->prev;
tail->next = NULL;
delete toDelete;
break;
}
node * ahead = toDelete->prev;
node * behind = toDelete->next;
ahead->next = behind;
behind->prev = ahead;
delete toDelete;
toDelete = behind->next->next;
}
}
它可以工作,但是当我尝试添加值为 47 的节点时,它不会添加它。我有这个:
29 7 2 3 31 37
什么时候我应该有这个:
29 7 2 3 31 37 47
这是我在链表后面添加新节点的代码:
void addBack(int x)
{
node * newItem = new node;
if (head == NULL && tail == NULL)
{
newItem->data = x;
newItem->next = NULL;
newItem->prev = NULL;
head = newItem;
tail = newItem;
}
else
{
newItem->data = x;
newItem->next = NULL;
newItem->prev = tail;
tail->next = newItem;
tail = newItem;
}
}
我不明白出了什么问题,因为 addBack 以前可以工作。但是在我使用了 tricimate 功能后,它就停止了工作。我做错了什么?
【问题讨论】:
-
删除节点后好像忘记改
tail了。请注意,您的代码还有其他几个潜在的错误(例如,如果只有一个节点并且您调用tricimate,第一行将导致运行时错误)。 -
如果
head或head->next是NULL,则node * toDelete = head->next->next;的行为未定义。 -
@WhatsUp 我的教授告诉我们假设链表中至少有三个节点,我到底在哪里不改变尾巴?
-
@E.Reyes 您为删除每三个节点而编写的这段代码似乎有些过头了。为什么不只是有一个计数器,在你浏览列表时递增它。如果
counter %3 == 0,删除你所在的当前节点?这不仅更容易编码,任何人都可以立即理解正在做什么。查看您发布的代码,很难判断您要做什么。
标签: c++ linked-list nodes doubly-linked-list