day03打卡
时间复杂度:O(N),空间复杂度:O(1)
第一想法:直接迭代,找到相同的元素,把它删除
困难:好久没有写链表的题,对指针指向节点有点生疏
看了题解:只实现了迭代,还明白了递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//创建虚拟头结点
ListNode* newHead = new ListNode;
newHead->next = head;
ListNode* cur = newHead;
//遍历找出等于val的节点并删除
while(cur->next != nullptr)
{
if(cur->next->val == val)
{
cur->next = cur->next->next;
}
else
cur = cur->next;
}
head = newHead->next;
delete newHead;
return head;
}
};
第一想法:各个功能都能想到对应方法,一开始的定义链表有点不太明白
困难:一开始对size、虚拟节点定义不太清楚
看了题解:明白了,怎么从0开始定义链表
class MyLinkedList {
public:
struct LinkedNode
{
int _val;
LinkedNode* next;
LinkedNode(int val):_val(val), next(nullptr)
{}
};
MyLinkedList() {
_size = 0;
_newHead = new LinkedNode(0);
}
int get(int index) {
//判断下标是否有效
if(index < 0 || index >( _size-1)) return -1;
LinkedNode* tmp = _newHead->next;
while(index--) tmp = tmp->next;
return tmp->_val;
}
void addAtHead(int val) {
addAtIndex(0, val);
}
void addAtTail(int val) {
addAtIndex(_size, val);
}
void addAtIndex(int index, int val) {
if(index > _size) return;
LinkedNode* tmp = _newHead;
//找到插入的位置
while(index--) tmp = tmp->next;
//开始插入
LinkedNode* node = new LinkedNode(val);
node->next = tmp->next;
tmp->next = node;
//插入后size++
_size++;
}
void deleteAtIndex(int index) {
//判断下标是否有效
if(index < 0 || index >= _size) return;
//找到目标位置
LinkedNode* cur = _newHead;
while(index--) cur = cur->next;
//开始删除
LinkedNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
_size--;
}
private:
int _size;
LinkedNode* _newHead;
};
/**
* 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);
*/
时间复杂度:O(N),空间复杂度:O(1)
第一想法:迭代,创建一个虚拟头节点,进行头插
困难:在头插时,遍历节点时,忘记使用临时变量记录下一个节点的地址
看了题解:明白递归的方法解决这个问题。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//创建虚拟头指针
ListNode* newHead = new ListNode;
ListNode* cur = head;
while(cur != nullptr)
{
//头插
ListNode* next = cur->next;
cur->next = newHead->next;
newHead->next = cur;
cur = next;
}
return newHead->next;
}
};