难度简单843
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
方法1
迭代
也可以用迭代的方法删除链表中所有节点值等于特定值的节点。
用 \textit{temp}temp 表示当前节点。如果 \textit{temp}temp 的下一个节点不为空且下一个节点的节点值等于给定的 \textit{val}val,则需要删除下一个节点。删除下一个节点可以通过以下做法实现:
\textit{temp}.\textit{next} = \textit{temp}.\textit{next}.\textit{next}
temp.next=temp.next.next
如果 \textit{temp}temp 的下一个节点的节点值不等于给定的 \textit{val}val,则保留下一个节点,将 \textit{temp}temp 移动到下一个节点即可。
当 \textit{temp}temp 的下一个节点为空时,链表遍历结束,此时所有节点值等于 \textit{val}val 的节点都被删除。
具体实现方面,由于链表的头节点 \textit{head}head 有可能需要被删除,因此创建哑节点 \textit{dummyHead}dummyHead,令 \textit{dummyHead}.\textit{next} = \textit{head}dummyHead.next=head,初始化 \textit{temp}=\textit{dummyHead}temp=dummyHead,然后遍历链表进行删除操作。最终返回 \textit{dummyHead}.\textit{next}dummyHead.next 即为删除操作后的头节点。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-linked-list-elements/solution/yi-chu-lian-biao-yuan-su-by-leetcode-sol-654m/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* dummyhead = malloc(sizeof(struct ListNode)); 先创建一个头结点,因为可能会删除原有头结点
//把struct ListNode 类型大小的元素首地址返回给dumyHead
dummyhead->next = head; temp是进行实际操作的指针
struct ListNode* temp = dummyhead;
while (temp->next != NULL) //如果没有走到最后一个
{
if (temp->next->val == val) //
{
temp->next = temp->next->next;//temp存放下一个结点的位置改为下下个。
}
else
{
temp = temp->next; ///否则就指向下一个
}
}
return dummyhead->next;
}
优点:重新创建了一个头结点安在前面,防止头结点被删除的情况。
实际只用了一个结点,方便。
自己写的
struct ListNode* removeElements(struct ListNode* head, int val)
{
//先定义前后两个指针
struct ListNode* q = head;
struct ListNode* p = head->next;
struct ListNode* T;
while (p != NULL)
{
if (p->val == val)
{
T = q;
q = p;
p = p->next;
// delete q;
p->next = p;
p = T;
}
q=p;
p++;
}
return head;
}
不足:
只是简单删除结点,不需要多个指针。
可以直接跳过,不一定要释放内存。
没有考虑头结点被删除的情况。
没有建立虚拟头结点,导致算法复杂。