typedef struct DoubleListNode{
int val;
DoubleListNode* next;
DoubleListNode* pre;
DoubleListNode(int value, DoubleListNode* n, DoubleListNode* p) :val(value), next(n), pre(p){}
};
class MyLinkedList{
public:
DoubleListNode* root;
DoubleListNode* trail;
int size;
MyLinkedList()//构造函数 初始化列表 动态数组的const len字段只能用初始化列表来初始化
{
root = nullptr;
trail = nullptr;
size = 0;
}
//通过索引得到节点
int get(int index)//2
{
int temp = 0;
DoubleListNode* cur = root;
while (cur != nullptr)
{
if (temp == index)
{
return cur->val;
}
cur = cur->next;
temp++;
}
return -1;
}
void addAtHead(int val)
{
if (root != nullptr)
{
DoubleListNode* newNode = new DoubleListNode(val, root, nullptr);
root->pre = newNode;
root = newNode;
}
else
{
root = new DoubleListNode(val, nullptr, nullptr);
trail = root;
}
size++;
}
void addAtTail(int val)
{
if (trail != nullptr)
{
DoubleListNode* newNode = new DoubleListNode(val, nullptr, trail);
trail->next = newNode;
trail = newNode;
}
else
{
trail = new DoubleListNode(val, nullptr, nullptr);
root = trail;
}
size++;
}
void addAtIndex(int index, int val)
{
if (index<=0)
{
addAtHead(val);
return;
}
if (index == size)
{
addAtTail(val);
return;
}
int temp = 0;
DoubleListNode* pre = nullptr;
DoubleListNode* cur = root;
while (cur != nullptr)
{
if (temp == index)
{
DoubleListNode* newNode = new DoubleListNode(val, cur, pre);
if (pre != nullptr)
{
pre->next = newNode;
}
cur->pre = newNode;
size++;
return;
}
pre = cur;
cur = cur->next;
temp++;
}
}
//移除给定索引处的节点
void deleteAtIndex(int index)
{
int temp = 0;
DoubleListNode* pre = nullptr;
DoubleListNode* cur = root;
if (index == 0)
{
DoubleListNode* old = root;
root = root->next;
if (root != nullptr)
{
root->pre = nullptr;
}
delete old;
size--;
return;
}
if (index == size-1)
{
DoubleListNode* old = trail;
trail = trail->pre;
if (trail != nullptr)
{
trail->next = nullptr;
}
delete old;
size--;
return;
}
while (cur != nullptr)
{
if (temp == index)
{
DoubleListNode* old = cur;
if (pre != nullptr)
{
pre->next = cur->next;
}
if (cur->next != nullptr)
{
cur->next->pre = pre;
}
delete old;
size--;
return;
}
pre = cur;
cur = cur->next;
temp++;
}
}
};
双向链表实现C++
最新推荐文章于 2022-09-22 15:27:33 发布