双向链表的基本概念
双向链表(Doubly Linked List)是一种链式数据结构,它允许从任意节点向两个方向(前向和后向)遍历。每个节点包含一个数据元素和两个指针,分别指向其前驱节点和后驱节点。这种结构提供了良好的灵活性,特别是在需要频繁插入和删除节点的场景中表现优异。
代码结构解析
-
节点定义(Node结构体):
-
每个节点存储一个整型数据(data),并具有两个指针(left和right),分别指向其前驱和后驱节点。
-
提供一个带有默认参数的构造函数,方便创建节点
-
struct Node
{
Node(int num = 0)
{
data = num;
left = nullptr;
right = nullptr;
}
int data;
Node* left;
Node* right;
};
-
双向链表类(tow_way_list类):
-
维护头(head)和尾(tail)指针,便于快速访问链表的两端。
-
提供构造函数初始化一个空链表(head和tail指向同一个默认节点)。
-
-
节点插入操作:
-
headpush(int data)
:在链表头部插入新节点。它负责调整头节点的指针和新节点的指针,确保链表结构的完整性。 -
endpush(int data)
:在链表尾部插入新节点。它更新尾节点的指针并将新节点设为尾节点。
-
-
节点删除操作(erase(int k)):
-
删除指定位置(k)的节点。该函数通过遍历链表找到目标节点,然后调整相关指针以移除该节点。
-
当删除尾节点时,特别处理以更新尾指针。
-
-
析构函数:
-
在对象生命周期结束时,释放链表中分配的所有内存,避免内存泄漏。
-
class tow_way_list
{
public:
tow_way_list()
{
head = tail = new Node;
}
void headpush(int data)
{
Node* temp = new Node(data);
temp->right = head->right;
temp->left = head;
if (temp->right == nullptr)tail = temp;
else head->right->left = temp;
head->right = temp;
}
void endpush(int data)
{
Node* temp = new Node(data);
tail->right = temp;
temp->left = tail;
tail = tail->right;
}
void erase(int k)//删除第几个节点
{
if (k <= 0)
{
throw "没有这个节点";
}
Node* p = head;
while (k--)
{
p = p->right;
if (p == nullptr)
{
throw "没有这个节点";
}
}
if (p == tail)tail = p->left;
else p->right->left = p->left;
p->left->right = p->right;
delete p;
}
~tow_way_list()
{
Node* p = head;
while (p != nullptr)
{
Node* temp = p->right;
delete p;
p = temp;
}
}
private:
Node* head;
Node* tail;
};