LinkList

linklist.h

#ifndef LINKLIST_H
#define LINKLIST_H

struct LinkNode {
  LinkNode() : data(0), pre(nullptr), next(nullptr) {}
  ~LinkNode() {}

  int data;
  LinkNode *pre;
  LinkNode *next;
};

class LinkList {
 public:
  LinkList();
  ~LinkList();

  // insert node at the head of list
  int InsertHead(LinkNode *node);

  // insert node at the tail of list
  int InsertTail(LinkNode *node);

  // insert node after sentinel
  int InsertAfter(LinkNode *node, LinkNode *sentinel);

  // insert node before sentinel
  int InsertBefore(LinkNode *node, LinkNode *sentinel);

  // remove node from list
  int Remove(LinkNode *node);

  // print the list
  void Print();

 private:
  LinkNode dummy_;
};

#endif

linklist.cc

#include "linklist.h"

#include <iostream>

LinkList::LinkList() {
  dummy_.next = &dummy_;
  dummy_.pre = &dummy_;
}

LinkList::~LinkList() {
  LinkNode *current = dummy_.next;
  while (current != &dummy_) {
    LinkNode *next = current->next;
    delete current;
    current = next;
  }
}

int LinkList::InsertHead(LinkNode *node) { return InsertAfter(node, &dummy_); }

int LinkList::InsertTail(LinkNode *node) { return InsertBefore(node, &dummy_); }

int LinkList::InsertAfter(LinkNode *node, LinkNode *sentinel) {
  if (!node || !sentinel) return -1;
  node->next = sentinel->next;
  node->pre = sentinel;
  sentinel->next->pre = node;
  sentinel->next = node;
  return 0;
}

int LinkList::InsertBefore(LinkNode *node, LinkNode *sentinel) {
  if (!node || !sentinel) return -1;
  node->pre = sentinel->pre;
  node->next = sentinel;
  sentinel->pre->next = node;
  sentinel->pre = node;
  return 0;
}

int LinkList::Remove(LinkNode *node) {
  if (!node || node == &dummy_) return -1;
  node->pre->next = node->next;
  node->next->pre = node->pre;
  delete node;
  return 0;
}

void LinkList::Print() {
  LinkNode *current = dummy_.next;
  while (current != &dummy_) {
    std::cout << current->data << " ";
    current = current->next;
  }
  std::cout << std::endl;
}

results matching ""

    No results matching ""