203.移除链表元素
题目链接:力扣https://leetcode.cn/problems/remove-linked-list-elements/
看到题目的第一想法:
已经做过很多链表的题目下,这道题还算是基本操作,其中注意没有虚拟头结点的话头结点需要单独处理,而且注意别写成if只除了一次头结点的小细节就好啦
/** * 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) { // 删除头结点 while(head != nullptr && head->val == val) { ListNode* tmp = head; head = head->next; delete tmp; } // 删除其他结点 ListNode* q = head; while(q != nullptr && q->next != nullptr) { if(q->next->val == val) { ListNode* tmp = q->next; q->next = q->next->next; delete tmp; } else { q = q->next; } } return head; } };
遇到的问题:
还可以,没什么大问题
707.设计链表
题目链接:力扣https://leetcode.cn/problems/design-linked-list/submissions/
看到题目的第一想法:
这道题涉及到链表的增删查了,是基本操作,注意涉及到链表设计方面注意一下要设置一个虚拟头结点就好
class MyLinkedList { public: struct LinkNode { int val; LinkNode* next; LinkNode(int val) : val(val), next(nullptr) {}; }; MyLinkedList() { _dummyHead = new LinkNode(0); _size = 0; } // 获取第index个结点的值 int get(int index) { if(index < 0 || index >= _size) { return -1; } LinkNode* head = _dummyHead->next; for(int i = 0; i < index; i++) { head = head->next; } return head->val; } // 添加一个首结点,值为val void addAtHead(int val) { LinkNode* head = new LinkNode(val); head->next = _dummyHead->next; _dummyHead->next = head; _size++; return; } // 添加一个尾结点,值为val void addAtTail(int val) { LinkNode* tail = new LinkNode(val); LinkNode* head = _dummyHead; while(head->next != nullptr) { head = head->next; } head->next = tail; _size++; return; } // 在第index个结点前添加一个为val的结点 void addAtIndex(int index, int val) { if(index > _size) { return; } if(index <= 0) { addAtHead(val); return; } if(index == _size) { addAtTail(val); return; } LinkNode* head = _dummyHead; for(int i = 0; i < index; i++) { head = head->next; } LinkNode* tmp = new LinkNode(val); tmp->next = head->next; head->next = tmp; _size++; return; } // 删除第index的结点 void deleteAtIndex(int index) { if(index < 0 || index >= _size) { return; } LinkNode* head = _dummyHead; while(index--) { head = head->next; } // 删除最后一个结点 LinkNode*tmp = head->next; head->next = head->next->next; delete tmp; _size--; return; } private: // 链表长度 int _size; // 虚拟头结点,有利于简化链表操作 LinkNode* _dummyHead; }; /** * 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); */
遇到的问题:
这道题遇到一个小问题就是在if判断的时候将||写成了&&导致非法条件没有被筛选出来出现错误,还是小细节上没处理好,做题还是要一步一步都要仔仔细细写啊~
206.反转链表
题目链接:力扣https://leetcode.cn/problems/reverse-linked-list/
看见题目的第一想法:
这道题之前才学链表的时候很不明白,做了很久才做出来,现在对于我来说还是能单独ac出来的,可能这就是成长把,继续加油!
/** * 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) { return reverse(nullptr,head); } ListNode* reverse(ListNode* p,ListNode* q) { while(q != nullptr) { ListNode* tmp = q->next; q->next = p; p = q; q = tmp; } return p; } };
遇到的问题:
没有遇到太大的问题