代码随想录算法训练营第三天 | 链表理论基础 | 203.移除链表元素
-
感觉上是可以轻松完成的,因为对链接的结构,元素的删除过程心里明镜似的
-
实际上四处跑气
- 结构体的初始化好像完全忘掉了,用
malloc
折腾半天,忘记了用new
,真想扇自己嘴巴子到飞起 - 删除后写一个函数,把链表打印出来,对于有些数据始终报段错误,后来发现是
removeElements
函数的返回值没有重新给头指针赋值,导致还指向已被删除的空间
- 结构体的初始化好像完全忘掉了,用
-
现在这些知识点自己还是有些基础的,但完全手生到跟没学一样啊
-
#include <iostream> struct ListNode { int val = 0; ListNode* next; ListNode(): val(0), next(nullptr) {} ListNode(int v): val(v), next(nullptr) {} ListNode(int v, ListNode* _next): val(v), next(_next) {} }; class Solution { public: ListNode* removeElements(ListNode* head, int val) { if (head == nullptr) return nullptr; auto* visualHead = new ListNode(0); visualHead->next = head; for (auto *p = visualHead; p->next != nullptr;) { if (p->next->val == val) { auto* temp = p->next; p->next = p->next->next; delete temp; } else p = p->next; } head = visualHead->next; delete visualHead; return head; } void show(ListNode* head) { for (auto* p = head; p != nullptr; p = p->next) std::cout << p->val << " "; std::cout << std::endl; } }; int main() { int del_val; std::cin >> del_val; ListNode* p = nullptr; for (int val; std::cin >> val; p = new ListNode(val, p)); std::cout << del_val << std::endl; Solution s; p = s.removeElements(p, del_val); s.show(p); return 0; } // 执行后输入5 5 5 3 2 5 5 1 a // 第一个5表示要删除的值,最后一个a表示输入结束,一开始会反向生成链表1->5->5->2->3->5->5->5,然后再把5的结点删除
-
测试代码耗时至少二个小时
-
在测试时发现,对链接的边界处的值设定与安排还是一头雾水,思想深刻度与对链表更精深的理解还不到位
-
当天其它题目:设计链表
-
当天其它题目:反转链表
-
汇总