题目描述
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList 类:
MyLinkedList()初始化MyLinkedList对象。int get(int index)获取链表中下标为index的节点的值。如果下标无效,则返回-1。void addAtHead(int val)将一个值为val的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)将一个值为val的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)将一个值为val的节点插入到链表中下标为index的节点之前。如果index等于链表的长度,那么该节点会被追加到链表的末尾。如果index比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)如果下标有效,则删除链表中下标为index的节点。
本题思路
代码如下:
class MyLinkedList {
public:
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val) : val(val), next(nullptr) {}
};
MyLinkedList() {
_size = 0;
_dummyHead = new LinkedNode(0);
}
// int get(int index)
// 获取链表中下标为index的节点的值。如果下标无效,则返回-1 。
int get(int index) {
// 边界需要减1
if (index > _size - 1 || index < 0)
return -1;
LinkedNode* cur = _dummyHead->next;
while (index--) {
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newNode = new LinkedNode(val);
// LinkedNode* cur = _dummyHead;//多余
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!=nullptr多余,因为虚拟头节点已经不为空,而cur->next判断下一个也不为空。如果到下回循环cur依然不为空,所以只需要判断cur->next
cur = cur->next;
}
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
if (index > _size) //_size即长度
return;
if (index < 0)
index = 0;
LinkedNode* cur = _dummyHead;
while (index--) {
// if (cur != nullptr && cur->next != nullptr) {
// 因为函数首先就已经判断完index的合法区间接下来就不必再考虑会不会为空
cur = cur->next;
//}
}
LinkedNode* newNode = new LinkedNode(val);
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
LinkedNode* cur = _dummyHead;
// 没判断index是否在合法区间
if (index >= _size || index < 0) {
return;
}
while (index--) {
// if(cur!=nullptr&&cur->next!=nullptr){ //多余
cur = cur->next;
//}
}
LinkedNode* tmp = cur->next;
cur->next = tmp->next;
delete tmp;
tmp = nullptr;
_size--;
}
private:
int _size;
LinkedNode* _dummyHead;
};
这算我当时遇到的第一个比较麻烦的代码。先看了代码随想录怎么写,再自己写。类似于中译英字字对应,要求是什么就一步一步写。