如何将元素追加到链表的末尾?

时间:2012-09-20 04:21:39

标签: c++ list linked-list append element

我试过寻找答案,但我似乎无法找到与我相匹配的东西。我正在为学校做一个模板链表,我正在犯错误的世界。但我现在只想要一个帮助。我应该将一个元素附加到链表的末尾,但我们得到:

append(ListNode)

起初,我想:“好的,创建一个新节点,并在后面插入......”但我读了它,我还有另外一个函数,我必须在两个链接列表连接在一起。所以我想我必须用已经制作的元素附加链表。这样当我做concat时,我可以使用我的追加来附加两者。或者至少......这只是我在想......

首先,我做了:

template<typename NODETYPE> 
bool List<NODETYPE>::append(NODETYPE &value)
{
    ListNode<NODETYPE> *newPtr = getNewNode(value); //creates new node

    if(isEmpty()) //checks if list is empty
    {
        firstPtr = lastPtr = newPtr;
        return true;
    }
    else //inserts new node at end of list
    {
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=newPtr;
        lastPtr = newPtr;
        return true;
    }
}

但由于这只附加了一个新节点,我无法使用它。有没有办法附加已经制作的节点?例如:将另一个链表附加到上一个?

我的concat(与我搜索过的其他人不同)只使用一个链表。先前的链表对象调用该函数,然后附加列表

concat(&List)

所以我很困惑。感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

首先,您需要更改append方法的签名,以便传递ListNode*,并且无论它是单个节点还是整个链接列表,它都会附加它。之后,您的代码应如下所示:

template<typename NODETYPE> 
bool List<NODETYPE>::append(ListNode<NODETYPE>* newPtr)
{
    //ListNode<NODETYPE> *newPtr = getNewNode(value); //creates new node

    if(isEmpty()) //checks if list is empty
    {
        firstPtr = lastPtr = newPtr;
        return true;
    }
    else //inserts new node at end of list
    {
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=newPtr;
        lastPtr = newPtr;
        while(lastPtr->nextPtr != NULL)
            lastPtr = lastPtr->nextPtr;
        return true;
    }
}

我没有编译它所以可能会有一些错误,但你明白了。

答案 1 :(得分:0)

连接列表的确切步骤取决于具体的实现细节。最简单的情况是单链表,在这种情况下,您只需将第二个头链接到旧尾。如果你有一个尾指针,记得更新它。对于双向链表,您还必须将第二个头链接回旧尾。如果您使用的是sentinal节点,请记住也要处理它。

编辑:忽略这一点,我感到困惑,并认为你可能会尝试使用标准列表。

在C ++中,std::list是带有sentinel节点的双向链表,这使得连接变得不重要。而且,无论如何,你不应该混淆内部。如果您想使用标准容器,则需要遵守公共API,否则会发生Bad Stuff。幸运的是,我确信有一个用于连接的库函数。

答案 2 :(得分:0)

为了将list2连接到列表list1,你必须将list2的头部附加到list1的最后一个节点并更新lastPtr,如下所示:

//apart from checking for basic sanity like empty list and things 
// suppose argument passed is ListNode list2
        ListNode<NODETYPE> *tempPtr = lastPtr;

        tempPtr->nextPtr=list2;
        tempPtr = list2;
        while(tempPtr->next != NULL) {
              tempPtr = tempPtr->next;
        }
         lastPtr = tempPtr;

        return true;