给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点
//删除链表中的元素
struct ListNode {
int val;
struct ListNode *next;
};
//单指针的迭代遍历
//这对于数据结构的小白来说非常好理解,遍历链表,判断节点值是否与给的值相同
struct ListNode* removeElements(struct ListNode* head, int val)
{
while (head != NULL && head->val == val)
head = head->next;
if (head == NULL)
return NULL;
struct ListNode* pre = head;
while (pre->next != NULL)
{
if (pre->next->val == val)
pre->next = pre->next->next;
else
pre = pre->next;
}
return head;
}
//除了单指针,双指针也能实现,双指针与单指针类似,不做说明
//递归算法
//在链表中运用递归的方法去解决问题非常的方便
//链表的递归思想:把链表看成是由头节点和一个更短的链表(此链表除了头节点以外)组成的
struct ListNode* removeElements(struct ListNode* head, int val)
{
if (head == NULL)
return head;
struct ListNode* p = removeElements(head->next, val);
if (head->val == val)
return p;
else
{
head->next = p;
return head;
}
}
//将链表与递归结合在一起,可以更好的去理解递归,对于小白来说可以很好的用来练习
//参照LeetCode的解题技巧,还可以运用堆栈的方法,在此不做说明