class MyLinkedList {
public:
struct node{
int val;
node *next;
node(int v) : val(v), next(nullptr){}
};
int len;
node *head, *end;
MyLinkedList() {
len = 0;
node *n = new node(0);
head = n;
end = n;
}
//get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
int get(int index) {
if(index >= len || index < 0)
return -1;
node *n = head;
for(int i = 0; i < index; ++i)
n = n->next;
return n->val;
}
只要判断index是否合法后不断调用next即可。
//addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
void addAtHead(int val) {
if(len == 0)
head->val = val;
else{
node *n = new node(val);
n->next = head;
head = n;
}
++len;
}
如果链表长度为0只需要改变head的值,否则new一个node,新的node的next指向头链表,头链表等于新的node
//addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。*/
void addAtTail(int val) {
if(len == 0)
head->val = val;
else{
node *n = new node(val);
end->next = n;
end = n;
}
++len;
}
如果链表长度为0只需要改变head的值,否则new一个node,新的node的next指向尾链表,尾链表等于新的node
/*addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。*/
void addAtIndex(int index, int val) {
if(index > len)
return;
else if(index <= 0){
addAtHead(val);
return;
}
else if(index == len){
addAtTail(val);
return;
}
node *n = head;
node *n1 = new node(val);
for(int i = 0; i < index - 1; ++i)
n = n->next;
n1->next = n->next;
n->next = n1;
++len;
}
判断输入的index是否合法,然后使用for循环使n到达指定链表块的前一个,new一个要插入的链表块n1,让n1的下一个链表块指向n的下一个链表块,然后使n的指向的下一个链表块变成n1。
原本的链表
新的链表
//deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
void deleteAtIndex(int index) {
if(index >= len || index < 0)
return;
else if(index == 0){
head = head->next;
--len;
return;
}
node *n = head;
for(int i = 0; i < index - 1; ++i){
n = n->next;
}
n->next = n->next->next;
if(index==len-1)
{
end=n;
}
--len;
}
};
判断index是否合法,做法和插入相反而已,找到前一个链表块,使前一个链表块之间指向下一个链表块即可。
原本的链表
新的链表