数据结构设计:
//定义链表节点结构体:
struct LinkedNode
{
int val;
LinkedNode* next;
LinkedNode(int val) :val(val), next(nullptr) {}
};
//构造函数初始化链表
MyLinkedList()
{
//定义一个虚拟头节点
_size = 0;
_dummyHead = new LinkedNode(0);
}
接口设计:
int get(int index);//获取第index处的数值
void addAtHead(int val);//在链表前面插入节点
void addAtTail(int val);//在链表最后面添加节点
void addAtIndex(int index, int val);//在index之前插入节点
void deleteAtIndex(int index);//删除第index处的节点
void printLinkedList();//打印链表
接口直线代码:
class MyLinkedList
{
public:
//定义链表节点结构体:
struct LinkedNode
{
int val;
LinkedNode* next;
LinkedNode(int val) :val(val), next(nullptr) {}
};
//构造函数初始化链表
MyLinkedList()
{
//定义一个虚拟头节点
_size = 0;
_dummyHead = new LinkedNode(0);
}
//获取第index处的数值
int get(int index)
{
if (index > _size || index < 0)
return -1;
LinkedNode* cur = _dummyHead->next;
//index -= 1;
//while(index++)
//在while()中某资料书说如果用 --index 程序会陷入死循环,实则不然,另外,如果使用index++,程序的 _size 和 cur->next 不对应,导致get()函数与添加删除函数对元素的操作存在一个单位的误差,需要在循环开始前先令index-1才能准确对应。不方便,尝试后,发现使用--index是可行的。本程序在visio studio 2019上能运行。
while (--index)
{
cur = cur->next;
}
return cur->val;
}
//在链表前面插入节点
void addAtHead(int val)
{
LinkedNode* tmp = new LinkedNode(val);
tmp->next = _dummyHead->next;
_dummyHead->next = tmp;
_size++;
}
//在链表最后面添加节点
void addAtTail(int val)
{
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cur = cur->next;
}
cur->next = newNode;
_size++;
}
//在index之前插入节点
void addAtIndex(int index, int val)
{
if (index > _size)
return;
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
index -= 1;
while (index--)
cur = cur->next;
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
//删除第index处的节点
void deleteAtIndex(int index)
{
if (index >= _size || index < 0)
return;
LinkedNode* cur = _dummyHead;
while (index--)
cur = cur->next;
LinkedNode* tmp = cur->next;
cur->next = tmp->next;
delete tmp;
_size--;
}
//打印链表
void printLinkedList()
{
LinkedNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cout << cur->next->val << " --> ";
cur = cur->next;
}
cout << endl;
}
private:
int _size;
LinkedNode* _dummyHead;
};
测试:
int main()
{
MyLinkedList* mylinklist = new MyLinkedList();
mylinklist->addAtTail(4);
mylinklist->printLinkedList();
cout << "--------------------" << endl;
mylinklist->addAtHead(2);
mylinklist->addAtHead(1);
mylinklist->printLinkedList();
cout << "--------------------" << endl;
mylinklist->addAtIndex(3, 3);
mylinklist->printLinkedList();
cout << "--------------------" << endl;
cout << mylinklist->get(4) << endl;
cout << "--------------------" << endl;
mylinklist->deleteAtIndex(4);
mylinklist->printLinkedList();
cout << "--------------------" << endl;
cout << mylinklist->get(1) << endl;
cout << flush;
return 0;
}