给你一个链表的头节点
head
和一个整数val
,请你删除链表中所有满足Node.val == val
的节点,并返回 新的头节点 。输入: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 输出:[]
- 设置一个虚拟头结点在进行删除操作。
- 假如移除的元素为1,如果没有虚拟头结点的话,移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。
所以头结点如何移除呢,其实只要将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。然后将原头结点从内存中删掉。
可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode* newhead;
//设置虚拟头结点
newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
newhead->next=head;
//设置一个指针,指向head的虚拟头结点
struct ListNode* p;
p=newhead;
while(p->next!=NULL)
{
if(p->next->val==val)
{
struct ListNode* tmp=p->next;//临时结点保存p->next的值,方便删除
p->next=p->next->next;
free(tmp);
}
else
{
p=p->next;
}
}
return newhead->next;
}