001.单链表的基础操作
单链表节点\(linknode\)包括数据域和指针域
template<typename ElemType>
struct LinkNode
{
ElemType data;
LinkNode* next;
LinkNode() : data(0), next(nullptr) {}
LinkNode(ElemType val) :data(val), next(nullptr) {}
LinkNode(ElemType val, LinkNode* Node) : data(val), next(Node) {}
};
单链表的基础操作
(1)创建:Linklist()
(2)销毁:~Linklist()
(3)头插法:void add_from_head(ElemType val)
(4)尾插法:void add_from_rear(ElemType val)
(5)找到值为val的元素:LinkNode<ElemType>* find_val(ElemType val)
(6)第i个节点对应的指针:LinkNode<ElemType>* get_node(int i)
(7)第i个节点对应的元素: bool get_val(int i, ElemType& res)
(8)设置第i个节点的元素:bool set_val(int i, const ElemType& val)
(9)插入节点:bool insert_node(int i, const ElemType& val)
(10)删除节点:bool delete_node(int i)
完整类模板:
template<typename ElemType>
struct LinkNode
{
ElemType data;
LinkNode* next;
LinkNode() : data(0), next(nullptr) {}
LinkNode(ElemType val) :data(val), next(nullptr) {}
LinkNode(ElemType val, LinkNode* Node) : data(val), next(Node) {}
};
template<typename ElemType>
class Linklist //带头节点的单链表
{
private:
LinkNode<ElemType>* head;
public:
Linklist()
{
head = new LinkNode<ElemType>();
}
~Linklist()
{
LinkNode<ElemType>* p = head;
while (p != nullptr)
{
LinkNode<ElemType>* temp = p;
p = p->next;
delete temp;
}
}
// 尾插法
void add_from_rear(ElemType val)
{
LinkNode<ElemType>* p = head;
LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
while (p->next != nullptr) p = p->next;
p->next = newnode;
}
// 头插法
void add_from_head(ElemType val)
{
LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
newnode->next = head->next;
head->next = newnode;
}
// 找到元素val,找不到返回nullptr
LinkNode<ElemType>* find_val(ElemType val)
{
LinkNode<ElemType>* p = head->next;
while (p != nullptr)
{
if (p->data == val) return p;
p = p->next;
}
return nullptr;
}
// 找到第i个节点对应的指针,找不到返回nullptr
// i的合法范围是[-1, 链表长度-1],其中i=-1返回头节点
LinkNode<ElemType>* get_node(int i)
{
if (i < -1) return nullptr;
LinkNode<ElemType>* res = head;
for (int k = 0; k <= i; k++) {
if (res == nullptr) return nullptr;
res = res->next;
}
return res;
}
// 找到第i个节点对应的元素
bool get_val(int i, ElemType& res)
{
if (i < 0) return false;
LinkNode<ElemType>* p = get_node(i);
if (p != nullptr)
{
res = p->data;
return true;
}
return false;
}
// 设置第i个节点对应的元素
bool set_val(int i, const ElemType& val)
{
if (i < 0) return false;
LinkNode<ElemType>* p = get_node(i);
if (p != nullptr)
{
p->data = val;
return true;
}
return false;
}
// 在第i个节点前插入一个节点作为第i个节点
// i的合法范围是[0, 链表长度]
bool insert_node(int i, const ElemType& val)
{
if (i < 0) return false;
LinkNode<ElemType>* p = get_node(i - 1);
if (p != nullptr)
{
LinkNode<ElemType>* newnode = new LinkNode<ElemType>(val);
newnode->next = p->next;
p->next = newnode;
return true;
}
return false;
}
// 删除第i个节点
// i的合法范围是[0, 链表长度-1]
bool delete_node(int i)
{
if (i < 0) return false;
LinkNode<ElemType>* p = get_node(i - 1);
if (p != nullptr && p->next != nullptr) {
LinkNode<ElemType>* q = p->next;
p->next = q->next;
delete q;
return true;
}
return false;
}
// 显示链表内容
void show()
{
cout << "List: ";
for (LinkNode<ElemType>* p = head->next; p != nullptr; p = p->next)
cout << p->data << " ";
cout << endl;
}
};
测试代码:
int main()
{
Linklist<int> list;
// 测试头插法
list.add_from_head(10);
list.add_from_head(20);
list.show(); // 输出: List: 20 10
// 测试尾插法
list.add_from_rear(30);
list.show(); // 输出: List: 20 10 30
// 测试插入
list.insert_node(1, 40); // 在位置1插入40
list.show(); // 输出: List: 20 40 10 30
// 测试查找
LinkNode<int>* node = list.find_val(10);
if (node != nullptr)
cout << "找到值: " << node->data << endl;
// 测试删除
list.delete_node(1); // 删除位置1的元素
list.show(); // 输出: List: 20 10 30
return 0;
}


浙公网安备 33010602011771号