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;
}