链表结点结构体:
template<class T>
struct ListNode
{
T data; // 数据域
ListNode* next; // 指针域
ListNode* prev; // 指针域
ListNode(const T& val = T())
{
data = val;
next = nullptr;
prev = nullptr;
}
~ListNode()
{
next = nullptr;
prev = nullptr;
}
};
链表结构体(对于链表销毁选择尾部断开置空方式)
template<class T>
class List
{
typedef ListNode<T> Node;
// 使用别名真的好用,上一篇queue全篇结点定义都是Node<T>
public:
List()
{
GetListHead(); // 头结点
}
~List()
{
head->prev->next = nullptr; // 断开尾部链表使其指向空
Node* del = head;
while (head)
{
head = head->next;
delete del;
del = head;
}
}
private:
Node* head;
void GetListHead() // 创建头结点
{
head = new Node();
head->next = head;
head->prev = head;
}
};
源码
#pragma once
#include<iostream>
template<class T>
struct ListNode
{
T data;
ListNode* next;
ListNode* prev;
ListNode(const T& val = T())
{
data = val;
next = nullptr;
prev = nullptr;
}
~ListNode()
{
next = nullptr;
prev = nullptr;
}
};
template<class T>
class List
{
typedef ListNode<T> Node;
public:
List()
{
GetListHead();
}
~List()
{
head->prev->next = nullptr;
Node* del = head;
while (head)
{
head = head->next;
delete del;
del = head;
}
}
void PushBack(const T& val = T())
{
Node* newNode = new Node(val);
Node* cur = head;
while (cur->next != head)
cur = cur->next;
cur->next = newNode;
head->prev = newNode;
newNode->next = head;
newNode->prev = cur;
cur = nullptr;
}
void PushFront(const T& val = T())
{
Node* Head_Next = head->next;
Node* newNode = new Node(val);
head->next = newNode;
newNode->prev = head;
newNode->next = Head_Next;
Head_Next->prev = newNode;
Head_Next = nullptr;
}
void PopBack()
{
if (head->next == head)
return;
Node* del = head->prev;
Node* pre = del->prev;
pre->next = head;
head->prev = pre;
delete del;
del = nullptr;
pre = nullptr;
}
void PopFront()
{
Node* del = head->next;
if (head->next == head)
{
del = nullptr;
return;
}
else if (head->next->next == head)
{
delete del;
head->next = head;
head->prev = head;
}
else
{
Node* cur = head->next->next;
head->next = cur;
cur->prev = head;
delete del;
}
del = nullptr;
}
Node* InsertPos(Node* pos, const T& val = T())
{
Node* pre = pos->prev;
Node* newNode = new Node(val);
pre->next = newNode;
newNode->next = pos;
newNode->prev = pre;
pos->prev = newNode;
pre = nullptr;
return newNode;
}
void ErasePos(Node* pos)
{
if (pos == head)
return;
Node* cur = pos->prev;
cur->next = pos->next;
cur->next->prev = cur;
delete pos;
pos = nullptr;
}
void Print()
{
Node* cur = head->next;
std::cout << "Head->";
if (cur == head)
{
std::cout << "该链表仅有一个头结点" << std::endl;
return;
}
while (cur != head)
{
std::cout << cur->data << "->";
cur = cur->next;
}
std::cout <<"nullptr" << std::endl;
}
Node* Get()
{
return head;
}
private:
Node* head;
void GetListHead()
{
head = new Node();
head->next = head;
head->prev = head;
}
};
void Test()
{
List<int> l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PushBack(5);
l.PushBack(6);
ListNode<int>* cur = l.Get()->next;
for (int i = 0; i < 3; i++)
{
cur = cur->next;
}
cur = l.InsertPos(cur, 10);
cur = cur->next;
l.ErasePos(cur);
l.Print();
return;
}
void Test2()
{
List<int> l;
l.PushFront(1);
l.PushFront(2);
l.PushFront(3);
l.PushFront(4);
l.PushFront(5);
l.Print();
l.PopFront();
l.PopFront();
l.PopFront();
l.Print();
l.PopFront();
l.PopFront();
l.Print();
l.PopFront();
l.Print();
return;
}
void Test1()
{
List<int> l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PushBack(5);
l.Print();
l.PopBack();
l.PopBack();
l.PopBack();
l.Print();
l.PopBack();
l.PopBack();
l.Print();
l.PopBack();
l.Print();
return;
}
#pragma once
#include<iostream>
template<class T>
struct ListNode
{
T data;
ListNode* next;
ListNode* prev;
ListNode(const T& val = T())
{
data = val;
next = nullptr;
prev = nullptr;
}
~ListNode()
{
next = nullptr;
prev = nullptr;
}
};
template<class T>
class List
{
typedef ListNode<T> Node;
public:
List()
{
GetListHead();
}
~List()
{
head->prev->next = nullptr;
Node* del = head;
while (head)
{
head = head->next;
delete del;
del = head;
}
}
void PushBack(const T& val = T())
{
Node* newNode = new Node(val);
Node* cur = head;
while (cur->next != head)
cur = cur->next;
cur->next = newNode;
head->prev = newNode;
newNode->next = head;
newNode->prev = cur;
cur = nullptr;
}
void PushFront(const T& val = T())
{
Node* Head_Next = head->next;
Node* newNode = new Node(val);
head->next = newNode;
newNode->prev = head;
newNode->next = Head_Next;
Head_Next->prev = newNode;
Head_Next = nullptr;
}
void PopBack()
{
if (head->next == head)
return;
Node* del = head->prev;
Node* pre = del->prev;
pre->next = head;
head->prev = pre;
delete del;
del = nullptr;
pre = nullptr;
}
void PopFront()
{
Node* del = head->next;
if (head->next == head)
{
del = nullptr;
return;
}
else if (head->next->next == head)
{
delete del;
head->next = head;
head->prev = head;
}
else
{
Node* cur = head->next->next;
head->next = cur;
cur->prev = head;
delete del;
}
del = nullptr;
}
Node* InsertPos(Node* pos, const T& val = T())
{
Node* pre = pos->prev;
Node* newNode = new Node(val);
pre->next = newNode;
newNode->next = pos;
newNode->prev = pre;
pos->prev = newNode;
pre = nullptr;
return newNode;
}
void ErasePos(Node* pos)
{
if (pos == head)
return;
Node* cur = pos->prev;
cur->next = pos->next;
cur->next->prev = cur;
delete pos;
pos = nullptr;
}
void Print()
{
Node* cur = head->next;
std::cout << "Head->";
if (cur == head)
{
std::cout << "该链表仅有一个头结点" << std::endl;
return;
}
while (cur != head)
{
std::cout << cur->data << "->";
cur = cur->next;
}
std::cout <<"nullptr" << std::endl;
}
Node* Get()
{
return head;
}
private:
Node* head;
void GetListHead()
{
head = new Node();
head->next = head;
head->prev = head;
}
};void Test()
{
List<int> l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PushBack(5);
l.PushBack(6);
ListNode<int>* cur = l.Get()->next;
for (int i = 0; i < 3; i++)
{
cur = cur->next;
}
cur = l.InsertPos(cur, 10);
cur = cur->next;
l.ErasePos(cur);
l.Print();
return;
}void Test2()
{
List<int> l;
l.PushFront(1);
l.PushFront(2);
l.PushFront(3);
l.PushFront(4);
l.PushFront(5);
l.Print();l.PopFront();
l.PopFront();
l.PopFront();
l.Print();
l.PopFront();
l.PopFront();
l.Print();
l.PopFront();
l.Print();
return;
}void Test1()
{
List<int> l;
l.PushBack(1);
l.PushBack(2);
l.PushBack(3);
l.PushBack(4);
l.PushBack(5);
l.Print();l.PopBack();
l.PopBack();
l.PopBack();
l.Print();
l.PopBack();
l.PopBack();
l.Print();
l.PopBack();
l.Print();
return;
}