给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
ListNode* newhead,*newtail;
newhead=newtail=NULL;
ListNode* pcur=head;
while(pcur)
{
if(pcur->val != val)
{
//新链表为空
if(newhead==NULL)
{
newhead=newtail=pcur;
}else
{
//链表不为空
newtail->next=pcur;
newtail=newtail->next;
}
}
pcur=pcur->next;
}
if(newtail)
{
newtail->next=NULL;
}
return newhead;
}
我们创建一个新链表,ListNode* newhead,*newtail分别表示这个新链表的头和尾。把新链表置为空
从头节点开始遍历,while循环判断条件为是否随着遍历走向空节点。在遍历中节点中的数据不等于要移除的值就把这些值放入链表中。但注意要区分情况,如果新链表为空就直接放入链表中,如果链表不为空就尾插。
到这里可能就以为做完了,但是还有一个坑。就拿上面的第一个示例来说当我们把5这一节点放入新链表中时,5这一节点还连接着下一节点也就是6这一节点。所以我们要把新链表的最后一个节点的下一个节点置为空。