C++ 中的双向链表 - insertFirst 与 insertLast 实现
Doubly-linked list in C++ - insertFirst vs. insertLast implementation
在我用 C++ 实现双向链表时,我不明白为什么在 insertFirst
中,你 总是 需要做 pNewLink->pNext = pFirst
但在 insertLast
中,如果列表不为空,您 仅 执行 pNewLink->pPrevious = pLast
?否则这两种方法似乎完全相反。
void insertFirst(double dd) //insert at front of list
{
Link* pNewLink = new Link(dd);
if( isEmpty() )
pLast = pNewLink;
else
pFirst->pPrevious = pNewLink;
pNewLink->pNext = pFirst;
pFirst = pNewLink;
}
void insertLast(double dd) //insert at end of list
{
Link* pNewLink = new Link(dd);
if( isEmpty() )
pFirst = pNewLink;
else
{
pLast->pPrevious = pLast;
pNewLink->pPrevious = pLast;
}
pLast = pNewLink;
}
首先,您的实现似乎不正确,因为当列表为空时,您不应在 insertFirst
中设置 pNewLink->pNext
。
如果您进行此修改,两种方法看起来都会更像 "symetric"。
如果最后插入。你没有 "next value" 所以你没有设置它但是你有以前的值所以你设置这个。
如果你先插入,你没有 "previous value" 所以你不设置它但是你有下一个值所以你设置这个。
在我用 C++ 实现双向链表时,我不明白为什么在 insertFirst
中,你 总是 需要做 pNewLink->pNext = pFirst
但在 insertLast
中,如果列表不为空,您 仅 执行 pNewLink->pPrevious = pLast
?否则这两种方法似乎完全相反。
void insertFirst(double dd) //insert at front of list
{
Link* pNewLink = new Link(dd);
if( isEmpty() )
pLast = pNewLink;
else
pFirst->pPrevious = pNewLink;
pNewLink->pNext = pFirst;
pFirst = pNewLink;
}
void insertLast(double dd) //insert at end of list
{
Link* pNewLink = new Link(dd);
if( isEmpty() )
pFirst = pNewLink;
else
{
pLast->pPrevious = pLast;
pNewLink->pPrevious = pLast;
}
pLast = pNewLink;
}
首先,您的实现似乎不正确,因为当列表为空时,您不应在 insertFirst
中设置 pNewLink->pNext
。
如果您进行此修改,两种方法看起来都会更像 "symetric"。
如果最后插入。你没有 "next value" 所以你没有设置它但是你有以前的值所以你设置这个。
如果你先插入,你没有 "previous value" 所以你不设置它但是你有下一个值所以你设置这个。