题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
1.获取第index个节点的数值,如果index是非法的,直接返回-1
int get(int index) {
if(index<0||index>(_size-1)){//保证index的合法性,不能小于0或者不能大于size-1
return -1;
}
LinkedNode* current = _dummyHead->next;//current指向虚拟头结点的下一个节点,即真实的节点;
while(index){
current = current->next;
index--;
}
return current->val;
}
2.头插:在链表的最前面插入一个新节点,插入完成后,新插入的节点成为链表新的头结点;
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
_size++;
}
3.尾插:在链表最后面添加一个节点:
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* current = _dummyHead;
//只要current的next不为空,那就一直往下找:
while (current->next!=nullptr)
{
current = current->next;
}
//此时current就位末尾元素了;
current->next = newNode;
_size++;
}
4.在第index之前插入一个节点:
//4.1 index = 0;插入的节点为链表的新头节点;
//4.2 index等于链表的长度(size),那么新插入的节点为链表的尾节点;
//4.3 index大于链表的长度,那么返回空;
//4.4 index小于0,则在头部插入节点:
void addAtIndex(int index,int val ){
if (index > _size)
return;
if (index < 0)
index = 0;
LinkedNode * newNode = new LinkedNode(val);
LinkedNode* current = _dummyHead;
//这个循环是找到第index个节点:
while (index) {
current = current->next;
index--;
}
newNode->next = current->next;
current->next = newNode;
_size++;
}
5.删除第index个节点,如果index大于等于链表的长度,直接return;
void deleteAtIndex(int index) {
if (index<0||index>=_size) {
return;
}
LinkedNode* current = _dummyHead;
while(index){
current = current->next;
index--;
}
LinkedNode* temp = current->next;
current->next = current->next->next;
//delete temp只是释放了temp指向的内存,但是它并不会删除指针temp本身,temp指着仍然保留着释放掉的内存地址;
//如果之前被temp指向的内训地址再次被系统使用,那么我们贸然操作temp将是非常危险的;
//因此将temp设置为空指针(nullptr)可以有效的保护之前temp指向的那块地址,保证它不会被随意使用;
delete temp;
temp = nullptr;
_size--;
}
6.打印链表
void printLinkedList() {
LinkedNode* current = _dummyHead;
while(current->next != nullptr) {
cout << current->next->val << " ";
current = current->next;
}
cout << endl;
}