【问题标题】:how to create an empty doubly linked list?如何创建一个空的双向链表?
【发布时间】:2011-04-13 18:04:33
【问题描述】:

如果我有以下节点类

class Node {
 public:
Node() { next = NULL; prev = NULL; }
~Node() {}
 public :
Node *next;
Node *prev;
T data;
 };

如何在函数中创建一个空链表

LinkedList::LinkedList()

我的链表类有以下功能

 void append(T item);
T get(int idx);
void insert(int idx, T item);
void map(T (*pf)(T item));
T remove(int index);
int size();
void unshift(T item);

【问题讨论】:

  • 你的LinkedList 班级是什么样的?
  • 你可以使用STL吗?

标签: c++ linked-list


【解决方案1】:

双向链表通常引用列表中的第一个和(有时)最后一个元素。

Node *first, *last;

在您的构造函数中,只需将这些设置为NULL。然后创建一个isEmpty 方法来检查这个条件,你就完成了。

LinkedList::LinkedList()
{
    first = NULL;
    last = NULL;
}

bool LinkedList::isEmpty()
{
    return (first == NULL) && (last == NULL);
}

【讨论】:

  • 我正在尝试使用上面显示的节点类
  • 还有更多 magicky 方法来实现双向链表,例如在列表中保留一个空节点,该节点使用指向自身的指针进行初始化并且不参与列表的内容。这种方法可以简化代码,因为不需要在每个操作中检查 null,因此代码分支的数量会减少。
  • 我一直在努力完成这项任务,有人可以指导我完成这项工作
【解决方案2】:

我的解决方案(从标准前的日子开始)一直是 带有指针的NodeBase 类,并从中派生到 添加数据。这允许我的 DLList 对象包含 NodeBase,而不是必须管理指针 分开。而NodeBase 总是有一个构造函数 将其链接到任何地方——通常是通过设置两个指针 对此,例如:

struct NodeBase
{
    NodeBase* next;
    NodeBase* prec;
    NodeBase()
        : next(this)
        , prec(this)
    {
    }
    ~NodeBase()
    {
        next->prec = prec;
        prec->next = next;
    }
};

这样做意味着没有明确的列表结束指示符( 实际列表是循环的),因此您必须跟踪您的位置 迭代时开始,但它使许多其他操作如此 容易得多。

【讨论】:

    【解决方案3】:

    正如其他答案所表明的那样,有不止一种方法可以做到这一点。这里有一个特别特别的信息供您参考:虽然它不是可移植的 C,所以也许更适合组装:

    struct Node {
        Node *next;
        Node *prev;
    };
    
    struct List {
        Node *a;
        Node *b;
        Node *c;
        List : a(tail()), b(0), c(head())
        Node *head() { return (Node *)&a; }
        Node *tail() { return (Node *)&b; }
    };
    

    所以,一个结构体包含一个虚拟头节点(其prev 指针当然总是0)和一个虚拟尾节点(其next 指针总是0),并节省大量sizeof(Node*) 字节存储每个列表,它们重叠(这就是它不可移植的原因)。重叠不是必需的,您可以在 List 中放置两个 Node 而不是三个 Node*

    这是一个有用的结构,因为它在列表中为您提供了“开始前”和“结束后”节点,这意味着您可以执行所有removeinsert_afterinsert_before 在节点上根本不参考列表头。在这方面,它就像 James 的循环列表,但与他不同的是,您还可以通过查找空指针来检查结尾 - 也无需参考头部。

    在“我不需要玩的技巧”下归档。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多