c++ 链表的简单实现
结合哨兵节点的实现
#include <iostream>
using namespace std;
struct LinkNode
{
int val;
LinkNode* next;
LinkNode(int val) : val(val) { next = nullptr; }
};
class MyLinkedList
{
private:
LinkNode* dummyHead;
int size;
public:
MyLinkedList()
{
dummyHead = new LinkNode(0); // 创建哨兵节点 // 一般设置成0或者-1
size = 0;
}
~MyLinkedList()
{
LinkNode* freeNode;
while (dummyHead != NULL)
{
freeNode = dummyHead;
dummyHead = dummyHead->next;
delete freeNode;
}
}
// 头创建
void addHead(int data)
{
LinkNode* newNode = new LinkNode(data); // 创建新节点
newNode->next = dummyHead->next; // 相当于 newNode->next = head; //指针域去指向head指针
dummyHead->next = newNode;
size++;
}
// 尾创建
void addTail(int data)
{
LinkNode* cur = dummyHead; //cur成为前驱节点 //真链表的头节点就dummyHead->next, 这个可以保持头不变
LinkNode* newNode = new LinkNode(data); // 创建一个节点
while (cur->next)
{
cur = cur->next;
}
cur->next = newNode;
size++;
}
// 插入
void insert(int data, int index)
{
if (index > size)
return;
LinkNode* cur = dummyHead;
LinkNode* newNode = new LinkNode(data);
while (index--)
{
cur = cur->next;
}
//插入
newNode->next = cur->next;
cur->next = newNode;
size++;
}
// 删除指定元素
void deleteVal(int data)
{
/*if (search(data) == 0)
return;*/
LinkNode* cur = dummyHead;
while (cur->next)
{
if (cur->next->val == data)
break;
cur = cur->next;
}
LinkNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
size--;
}
// 删除指定索引
void deleteInd(int index)
{
if (index >= size || index < 0)
return;
LinkNode* cur = dummyHead;
while (index--)
{
cur = cur->next;
}
LinkNode* temp = cur->next; //第 index个节点并不是ndex的
cur->next = cur->next->next;
delete temp;
size--;
}
// 显示
void show() const
{
LinkNode* cur = dummyHead;
while (cur->next)
{
cout << cur->next->val;
cur = cur->next;
}
cout << endl;
}
};
int main(void)
{
return 0;
}