首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从链接列表中删除将返回垃圾值

从链接列表中删除将返回垃圾值
EN

Stack Overflow用户
提问于 2020-10-23 08:01:42
回答 1查看 85关注 0票数 0

类Listnode是链接列表的最小实现。它有基本的操作,如在头部、尾部和特定位置插入。它也有删除的实现。到目前为止,delete在头,delete在尾部工作,但是在一个特定的索引结果中删除它,用垃圾替换值。

这是代码

代码语言:javascript
复制
#include <iostream>
class ListNode {
        friend std::ostream &operator<<( std::ostream &os, const ListNode &n ) {
        ListNode *temp = n.head;
        os << "[ ";
        while ( temp != n.tail ) {
            os << temp->data << ", ";
            temp = temp->next;
        }
        os << temp->data << " ]";
        return os;
    }
    private:
        ListNode *prev;
        int data;
        ListNode *next;
        int sizeOfList;
        ListNode *head, *tail;

        bool outOfBound( int index, int size ) {
                if ( index >= sizeOfList || index < 0 ) 
                    return true;
                return false;
        }

    public:
        ListNode() : prev(nullptr), data(0), next(nullptr), sizeOfList(0), head(nullptr), tail(nullptr) {}

        void create( int val ) {
            ListNode *newNode = new ListNode;
            newNode->data = val;
            if( head == nullptr )
                head = tail = newNode;
            else {
                tail->next = newNode;
                newNode->prev = tail;
                tail = newNode;
            }
            ++sizeOfList;
        }
        
        int size() { return sizeOfList; }
        void insertAtHead( int val ) {
            ListNode *newNode  = new ListNode;
            newNode->data = val;
            newNode->next = head;
            head->prev = newNode;
            head = newNode;
            ++sizeOfList;
        }

        void insertAtTail( int val ) {
            ListNode *newNode  = new ListNode;
            newNode->data = val;
            newNode->prev = tail;
            tail->next = newNode;
            tail = newNode;
            ++sizeOfList;
        }
        void insert( int index, int val ) {
            if( index == 0 ) {
                insertAtHead( val );
                return;
            }
            if( index == sizeOfList - 1 ) {
                insertAtTail( val );
                return;
            }
            if(outOfBound( index, sizeOfList ) )
                throw std::out_of_range("Exception: Out of Range.");
            int i = 1;
            ListNode *temp = head;
            ListNode *newNode = new ListNode;
            newNode->data = val;
            while( i != index ) {
                temp = temp->next;
                ++i;
            }
            newNode->prev = temp;
            newNode->next = temp->next;
            temp->next = newNode;
            temp->next->prev = newNode;
            ++sizeOfList;
        }
        void deleteAtHead() {
            ListNode *temp = head;
            head = head->next;
            head->prev = nullptr;
            delete temp;
            --sizeOfList;
        }
        void deleteAtTail() {
            ListNode *temp = tail;
            tail = tail->prev;
            tail->next = nullptr;
            delete temp;
            --sizeOfList;
        }
        void erase( int index ) {
            if( index == 0 ) {
                deleteAtHead();
                return;
            }
            if( index == sizeOfList - 1 ) {
                deleteAtTail();
                return;
            }
            if(outOfBound( index, sizeOfList ) )
                throw std::out_of_range("Exception: Out of Range.");

            int i = 1;
            ListNode *temp = head;
            while( i != index + 1 ) {
                temp = temp->next;
                ++i;
            }
            temp->prev->next = temp->next;
            temp->next->prev = temp->prev;
            delete temp;
            --sizeOfList;
        }
};

主函数

代码语言:javascript
复制
#include <iostream>
#include "doubly.hh"

int main() {
    ListNode list;
    for (int i = 0; i != 11; ++i )
        list.create(i);
    list.insertAtHead(54);
    list.insertAtTail(56);
    list.insert(1,67);
    list.deleteAtHead();
    list.deleteAtTail();
    list.erase(1);
    std::cout << list << std::endl;
}

在运行这段代码时,我的输出是

代码语言:javascript
复制
[67, -921944048, 1, 2, 3, 4, 5,6,7,8,9,10]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-23 10:22:34

问题就在insert的内部。名单在那里被破坏了。

在insert函数中,替换这两行的顺序:

代码语言:javascript
复制
temp->next = newNode;        // temp->next becomes newMode
temp->next->prev = newNode;  // newMode->prev points to newMode itself

它们必须是:

代码语言:javascript
复制
temp->next->prev = newNode;
temp->next = newNode;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64496169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档