题目
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5
难点分析
这个其实就是简单的给链表删除给定值的节点的题目,但是难点在没有头节点(好像Leetcode一般给的链表题目都没有头节点)所以假设待删除的节点是头指针的话,就要特殊处理了
特殊处理的方法是:在遍历指针前加一个类似于“前驱指针“的指针,初始时让他置为空,为了保证头指针删除时方便,则通过判断”前驱指针”是否为空即可
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val)
{
struct ListNode* cur = head;//当前位置指针
struct ListNode* prev = NULL;//当前位置之前的指针
struct ListNode* next;
while(cur)
{
if(cur -> val == val)//判断数值是否需要被删除
{
next = cur -> next;//记住当前位置之后的位置
free(cur);//释放当前的需要删除的空间
cur = next;//让cur指向下一个位置
if(prev == NULL) //prev在初始时为NULL,但凡顺移一位,即cur不是头节点时,所以prev==NULL,即cur此时为头节点
{
head = next;//此处如果删除的是头节点的话,让头节点指向下一个位置
//特殊处理头节点,防止前几位都是要删除的,这样的话就可以统一删除了
}
else
{
prev -> next = next;//如果删除的不是头节点让prev的next的指针指向当前位置
}
}
else //不是要删除的节点,让指针顺移
{
prev = cur;
cur = cur -> next;
}
}
return head;
}