简体   繁体   English

循环双链表C ++

[英]Circular Doubly Linked List C++

The removeNode() function implements a circular doubly linked list which has a sentinel node. removeNode()函数实现一个循环的双向链表,该链表具有一个前哨节点。 What I am trying to do is defined in pseudo code next to the function. 我要执行的操作是在函数旁边的伪代码中定义的。 I simply just am having a hard time understanding how to do so. 我只是很难理解如何去做。

#include "CDLList.h"

#include <iostream>

using namespace std;

ListNode *createList()
{
    ListNode *sentinel = new ListNode();
    sentinel->last = sentinel;
    sentinel->next = sentinel;

    return sentinel;
}

void destroyList(ListNode *&sentinel)
{
    // Delete any item nodes
    clearList(sentinel);

    // Delete the sentinel node
    delete sentinel;
    sentinel = nullptr;
}

bool isEmpty(ListNode *sentinel)
{
    return (sentinel == sentinel->next);
}

ListNode *findNode(ListNode *sentinel, string value)
{
    ListNode *pCurrNode = sentinel->next;
    while (pCurrNode != sentinel)
    {
        // Check if we found the node
        if (pCurrNode->item == value)
        {
            return pCurrNode;
        }

        // Move to next node
        pCurrNode = pCurrNode->next;
    }

    return nullptr;
}

void addItem(ListNode *sentinel, string value)
{
    ListNode *newNode = new ListNode;
    newNode->item = value;
    newNode->last = sentinel->last;
    newNode->next = sentinel;

    sentinel->last->next = newNode;
    sentinel->last = newNode;
}

void removeNode(ListNode *node) // Implement this function!
{
    // Unlink node

    // Delete node
}

The removeNode() function is called within these two functions 在这两个函数中调用removeNode()函数

void removeItem(ListNode *sentinel, string value)
{
    ListNode *node = findNode(sentinel, value);

    // If the item was not found, there's nothing to do (remove)
    if (node == nullptr)
    {
        return;
    }

    removeNode(node);
}
void clearList(ListNode *sentinel)
{
    while (!isEmpty(sentinel))
    {
        removeNode(sentinel->next);
    }
}

Here's the function implementation: 这是函数的实现:

void removeNode(ListNode *node)
{
    if(!isEmpty(node))
    {
        ListNode* nodeLast = node->last;
        ListNode* nodeNext = node->next;

        // Unlink node
        nodeLast->next = nodeNext;
        nodeNext->last = nodeLast;
    }

    // Delete node
    delete node;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM