本次记录代码随想录的链表部分的学习
一.移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
思路
这里要思考两种情况
一种是要删除的元素位于头结点
另一种是不在头结点
如果是在链表头,那么删除起来不太方便,所以我们考虑加入一个头指针,方便我们操作,头结点不存储任何数据,它的作用只是指向链表的第一个元素
这样我们操作起来就会比较方便,在返回的之后只需要返回头指针指向的节点即可
如果有头指针,我们就可以不断遍历每个元素的值,如果检测到值为val,就删除这个节点
/** * 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* hp = new ListNode(0); hp->next = head; ListNode* cur = hp; while (cur->next != NULL && cur != NULL) { if (cur->next->val == val) { ListNode* tmp = cur->next; cur->next = cur->next->next; delete tmp; } else { cur = cur->next; } } head = hp->next; delete hp; return head; } };
上面是有头指针的情况,如果没有人为设置的头指针,那么应该怎么处理