C ++将前一个节点连接到单链表中的匹配节点

时间:2017-02-24 05:04:24

标签: c++ data-structures linked-list

开始:这是家庭作业问题的一部分,所以请随意提示答案或指出正确的方向,而不是直接回答。

我在c ++中创建一个链表,其中一个必需的函数是void remove(const T& key),如果值与传递给函数的键匹配,则删除给定节点。

我目前的想法是,首先必须找到要删除的节点,找到要删除的节点之前的节点,然后找到要删除的节点之后的节点。从那里我可以删除需要删除的节点,并将前一个节点设置为指向已删除节点之后的节点。

以下是相关功能:

LinkedList.h

//Returns the node with passed in value key
ListNode<T>* find(const T& key) {
    ListNode<T>* currentNode = _head;
    while(currentNode != NULL && currentNode->data() != key){
        currentNode = currentNode->next();  
    }
    return currentNode; 
}

//Returns the node before the key
ListNode<T>* findPreviousNode(const T& key){
    ListNode<T>* previousNode;
    ListNode<T>* currentNode = _head;

    while(currentNode != NULL && currentNode->data() != key){
        previousNode = currentNode;
        currentNode = currentNode->next();  
    }
    return previousNode;
}

// Removes and deletes the first node in the linked list that has data
// equal to the  key
void remove(const T& key) {
    ListNode<T>* nodeToDelete = find(key);
    ListNode<T>* previousNode = findPreviousNode(key);
    ListNode<T>* nextNode = nodeToDelete->next();
    delete nodeToDelete;
    previousNode->setNext(nextNode);

}

我已经广泛测试了我的find(const T& key)函数并且它有效,所以我相信问题出在我的findPreviousNode函数中,但是当我浏览代码时它似乎工作正常。

在我看来,previousNode将始终具有最后一个已检查元素,并且当找到匹配时,它返回尚未更新的previousNode,因此它仍然包含直接位于匹配节点之前的节点,但是这显然不是& #39;正确,我不知道为什么。当我运行代码时,我得到了一个

  

分段错误(核心转储)

错误消息

以下是包含整个代码的一些pastebins:

LinkedList.h http://pastebin.com/b4miZBzA

main.cpp(调用测试函数的方法)http://pastebin.com/0QGtUhjC

1 个答案:

答案 0 :(得分:1)

根据您在问题中发布的代码,您似乎有正确的想法。

两个提示:

  1. 防御性编程。检查nodeToDelete和previousNode是否为NULL。目前,如果找不到密钥,您将最终取消引用NULL指针,这可能是导致分段错误的原因。

  2. 效率。为什么要遍历列表两次(一次在&#39;找到&#39;,一次在&#39; findPrevious&#39;),当你可以只遍历它并获得两个值?即结合find()和findPrevious()函数来减少程序必须完成的工作量。