定义的事情没什么好说的,只能说些学习的感慨,以前学数据结构的时候贪图速度,看了C的定义直接跳过了,又不敲代码,对这些东西的理解太浅了,经过这一系列的学习,对基础终于有人更深的认识,这些定义不知道怎么写,直接抄答案复制粘贴的
class MyLinkedList {
public:
MyLinkedList() {
this->size=0;
this->head=new ListNode(0);
}
int get(int index) { //获取链表中第 index 个节点的值。如果索引无效,则返回-1
if(index<0||index>=size){
return -1;
}
ListNode *cur=head;
for(int i=0;i<=index;i++){
cur=cur->next;
}
return cur->val;
}
void addAtHead(int val) { //在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的 第一个节点。
addAtIndex(0,val);
}
void addAtTail(int val) {//将值为 val 的节点追加到链表的最后一个元素
addAtIndex(size,val);
}
void addAtIndex(int index, int val) { //在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
if(index>size){
return;
}
index=max(0,index);
size++;
ListNode *pred=head;
for(int i=0;i<index;i++){ //如果index小于0,则index为0,i为0的时候,i<index为假,不执行
pred=pred->next;
}
ListNode *toAdd=new ListNode(val);
toAdd->next=pred->next;
pred->next=toAdd;
}
void deleteAtIndex(int index) {//如果索引 index 有效,则删除链表中的第 index 个节点。
if(index<0||index>=size){ //0为第一个结点,所以等于长度的结点无效
return;
}
size--;
ListNode *pred=head;
for(int i=0;i<index;i++){ //i=0时,删除第一个结点,i=0时,这个for不执行,pread是头节点
pred=pred->next;
}
ListNode *p=pred->next;
pred->next=pred->next->next;
delete p;
}
private:
int size;
ListNode *head;//没有这些this不成功
};
/**
* 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);
*/
第一次抄的时候没把后面的private:之后的带上,真是好笑。