移除链表元素
要求如下:
leetcode链接
请点击这里
方法:哨兵节点
如果删除的节点是中间的节点,则问题似乎非常简单:
选择要删除节点的前一个结点 prev。
将 prev 的 next 设置为要删除结点的 next。
当要删除的一个或多个节点位于链表的头部时,事情会变得复杂。
可以通过哨兵节点去解决它,哨兵节点广泛应用于树和链表中,如伪头、伪尾、标记等,它们是纯功能的,通常不保存任何数据,其主要目的是使链表标准化,如使链表永不为空、永不无头、简化插入和删除。
在这里哨兵节点将被用于伪头。
算法:
初始化哨兵节点为 newlist 且设置 newlist->next = head。
初始化两个指针 cur 和 pre 指向当前节点和前继节点。
当 cur != NULL:
比较当前节点和要删除的节点:
若当前节点就是要删除的节点:则 pre->next = cur->next。
否则设 prv = cur。
遍历下一个元素:cur = cur->next。
返回 newlist.next。
图示如下:
实现代码:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode* newlist = (struct ListNode*)malloc(sizeof(struct ListNode));
newlist->next =head;
struct ListNode* pre = newlist;
struct ListNode* cur = head;
while(cur)
{
if(cur->val == val)
{
pre->next = cur->next;
}
else
{
pre = cur;
}
cur = cur->next;
}
return (newlist->next);
}