题目:707. 设计链表
1、获取下标为index的节点的值。index=0就是头结点。那么先对index进行判断
考虑超出的情况:index<0,index>size-1
2、头部插入节点
尾部插入节点条件:current->next=NULL
第n个节点前插入节点:保证第0个节点是current->next
删除第n个节点:第n个节点是current->next
也就是说每次操作的指针都是要处理的节点的上一个,来保证我们能找到要处理的节点。
// cur始终是要操作的元素的上一个指针,也就是说cur始终指向要操作的元素
class MyLinkedList {
public:
//链表节点结构体的定义
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){} // 构造函数
};
MyLinkedList() {
//_表明变量是MyLinkedList的成员变量,是他的数据成员
_dummyHead = new LinkedNode(0);//虚拟头结点
_size = 0;
}
int get(int index) {
if(index < 0 || index >(_size-1) ){
return -1;
}
LinkedNode* cur = _dummyHead->next;//用了MyLinkedList的成员变量_dummyHead
//因为我有虚拟头节点,一开始cur指向第0个节点,下标从0开始,下标 是几就要循环几次
while(index--){
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
newNode->next = _dummyHead->next; //指针不能相等,但指向同一个位置
_dummyHead->next = newNode;
_size++;//更新链表大小
}
void addAtTail(int val) {
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
//从头结点开始往后走,直到发现一个节点的下一个节点是空,就执行添加操作
while(cur->next != nullptr){
cur = cur->next;
}
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index > _size) return;//大于长度时不执行
if(index<0) index = 0;
LinkedNode* newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;//第一次循环后cur才指向头结点
}
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
// cur始终是要操作的元素的上一个指针,也就是说cur始终指向要操作的元素
void deleteAtIndex(int index) {
if( index >= _size || index < 0){
return;
}
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;
}
LinkedNode* temp = cur->next;//删掉要操作的元素
cur->next = cur->next->next;
delete temp;
temp = nullptr;//避免这个指针成为悬挂指针
_size--;
}
//打印链表
void printLinkedList(){
LinkedNode* cur = _dummyHead;
while(cur->next != nullptr){
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
private:
int _size;
LinkedNode* _dummyHead;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/