今日是代码随想录第三天,进入了链表的章节,之前自己刷的时候也做过链表方面的题目,但是就是眼高手低的问题一直存在,包括直到今天这个问题都没有彻底解决,喜欢边看边敲,缺少回顾,这是大忌,以后应该早上起来做题,然后晚上进行回顾和总结,这样感觉更加有效率一些,下面对今日的三道题目进行复习和总结
203.移除链表元素
链表是一种与数组不同的数据结构,其并非线性的数据结构,有点像螳螂捕蝉黄雀在后的感觉,一个接着一个,没有办法跳过其中的某一个直接访问到下一个。
这道题目的是移除链表中的某一元素,那么根据链表的定义,我们只需要索引到该位置,然后让该位置的下一节点指向为下下一节点,然后删除中间节点占用的内存就好了。
具体代码如下
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* help = new ListNode(0);
help->next = head;
ListNode* cur = help;
while(cur->next!=NULL){
if(cur->next->val==val){
ListNode* tem = cur->next;
cur->next=cur->next->next;
delete tem;
}else{
cur = cur->next;
}
}
head = help->next;
delete help;
return head;
}
};
这里为了方便对整个链表进行操作,我们需要西安创建一个虚节点,我一般把这个节点写作帮助节点,放在该列表的最开始,在操作结束之后删除帮助节点就可以了。
707.设计链表
这个题目感觉比较复杂,就偏向于底层一些,要从底层逻辑上了解链表的结构,具体代码
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val),next(nullptr){}
};
MyLinkedList() {
_dummyHead = new LinkedNode(0);
_size = 0;
}
int get(int index) {
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);
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 = cur->next;
}
cur->next = newNode;
_size++;
}
void addAtIndex(int index, int val) {
if(index>_size)return;
if(index<0) index = 0;
LinkedNode *newNode = new LinkedNode(val);
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;
}
newNode->next = cur->next;
cur->next = newNode;
_size++;
}
void deleteAtIndex(int index) {
if(index>=_size||index<0){
return ;
}
LinkedNode* cur = _dummyHead;
while(index--){
cur = cur->next;
}
LinkedNode* tmp = cur->next;
cur->next = cur ->next->next;
delete tmp;
_size--;
}
private:
int _size;
LinkedNode* _dummyHead;
};
这个具体就不多写了,今天晚上自己再思考
206 反转链表
这个题目,有两个思路,一种是利用三个指针原地反转,还有一种在群里看到的,新建一个栈,然后把元素一个一个放进去然后再取出来
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = head;
ListNode* pre = NULL;
while(cur){
ListNode* tmp = cur->next;
cur->next=pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
今晚今晚如果我回头复习了这几道题目的话,那我就在下面添加一行激励自己的话哈哈哈哈哈哈