3

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

append(ListNode)

起初,我想:“好吧,创建一个新节点,然后在后面插入……”但我读了一遍,我必须创建另一个函数,将两个链表连接在一起。所以我想我必须在链接列表中附加一个已经制作的元素。这样,当我进行连接时,我可以使用我的附加来附加两者。或者至少……这只是我的想法……

所以一开始,我做了:

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)

所以我都很困惑。任何帮助表示赞赏,谢谢!

4

3 回答 3

1

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

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

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

于 2012-09-20T04:31:02.393 回答
0

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

编辑:忽略这一点,我很困惑,并认为您可能正在尝试使用标准列表。

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

于 2012-09-20T04:26:15.000 回答
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;
于 2012-09-20T04:28:24.117 回答