001 初始化
struct ListNode{
int val = 0;
ListNode *next = nullptr;
ListNode(){}
ListNode(int x){val = x;}
};
ListNode dummy;
ListNode* tail = nullptr;
int length = 0;
新建一个dummy头,tail结点指向dummy;
MyLinkedList() {
tail = &dummy;
}
002 尾部插入结点
tai结点的next指针指向新的节点,并且tail指针往后移
void addAtTail(int val) {
tail->next = new ListNode(val);
tail = tail->next;
length++;
}
003 头部插入结点
新节点的next指针指向dummy的next指针指向的节点,并且更新dummy的next指针指向心节点;如果tail和dummy指向同一个节点那么。tail指针指向心的节点
void addAtHead(int val) {
ListNode *p = new ListNode(val);
p->next = dummy.next;
dummy.next = p;
// NOTE change tail
if (tail == &dummy) {
tail = p;
}
length++;
}
004 查找结点
这里需要判断列表的边界 如果index 小于0 或者大于等于length 就返回-1
int get(int index) {
if (index < 0 || index >= length) {
return -1;
}
return getPreNode(index)->next->val;
}
005 插入指定位置之前
这里也需要对链表的index边界进行判断
如果index 大于长度 返回空;如果index等于长度那么插入尾部;如果index小于等于0 那么插入头部,最后就是处理一般情况
一般情况下需要获取index之前的pre结点,新的节点next指向pre的next;per的next指向心的节点
void addAtIndex(int index, int val) {
if (index > length) {
return;
} else if (index == length) {
addAtTail(val);
return;
} else if (index <= 0) {
addAtHead(val);
return;
}
ListNode *pre = getPreNode(index);
ListNode *p = new ListNode(val);
p->next = pre->next;
pre->next = p;
// NOTE: here tail has been changed
length++;
}
006 删除结点
要对删除的边界点进行判断;如果index小于0或者大于等于长度(在头尾删除) 就没不要删除操作
如果是要删除最后一个节点只需要改变tail的指向;删除操作就是将pre的next指针跨过要删除的节点
void deleteAtIndex(int index) {
if (index <0 || index>= length) {
return;
}
ListNode *pre = getPreNode(index);
if (tail == pre->next) {
tail = pre;
}
length--;
pre->next = pre->next->next;
}