单链表
编译环境
windows
gcc version 8.1.0
- link_list.hpp
底层封装了一个带头结点的单链表,模板类,以后习题都采用此数据结构实现
API
LinkList(std::initializer_list<T> li) //初始化构造单链表
void push(U val) //插入元素(头插法)
void pop() //删除元素
pointer_type erease(pointer_type p) //删除传入指针的元素
pointer_type erease(pointer_type beg, pointer_type end) //删除传入指针范围的元素
reference front() //返回头元素
const_reference front() const //返回头元素
value_type back(size_type k) const //返回尾部第k个元素
pointer_type backPtr(size_type k) //返回尾部第k个指针
bool empty() const //判断链表是否为空
size_type size() const //返回元素个数
void reverse() //逆置整个单链表
void reverse(Node<U>* beg) //逆置传入指针到表尾
void reverse(Node<U>* beg, Node<U>* end) //逆置传入指针范围的元素
pointer_type find(value_type val) //返回值为 val 的指针
void sort() //链表排序,默认升序
pointer_type headNode() //返回头结点
const_pointer_type headNode() const //返回头结点
pointer_type midPtr() //返回中间元素的指针
void swap(Node<U>* x) //交换两个单链表
void link(Node<U>* x) //将当前单链表链接到 x,测试使用
初始化列表创建
void test() {
LinkList<int> li1 {1,3,5,114514,9,7,45};
auto* p = li1.headNode()->next;
while(p) {
cout << p->data << " ";
p = p->next;
}
}
push, headNode
void test() {
LinkList<int> li1;
for(int i = 0; i != 10; ++i)
li1.push(i);
auto* p = li1.headNode()->next;
while(p) {
cout << p->data << " ";
p = p->next;
}
}
pop, empty, front
void test() {
LinkList<int> li1;
for(int i = 0; i != 10; ++i)
li1.push(i);
while(!li1.empty()) {
cout << li1.front() << " ";
li1.pop();
}
}
reverse, back
void test() {
LinkList<int> li1 {0,1,3,5,1245,4657,8521};
li1.reverse();
cout << li1.back(1) << "\n";
cout << li1.back(0) << "\n";
// auto* p = li1.headNode()->next;
// while(p) {
// cout << p->data << " ";
// p = p->next;
// }
}
size, midPtr, erease
void test() {
LinkList<int> li1 {0,1,3,5,1245,4657,8521};
cout << li1.size() << "\n";
auto* p = li1.midPtr();
li1.erease(p);
cout << li1.size() << "\n";
}