在链表删除当中,删除头结点和删除非头结点的操作是不一样的,链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点,所以需要单独写一段逻辑来处理移除头结点的情况。
为了统一操作链表,不用单独为操作头结点额外书写逻辑,可以设置一个虚拟头结点。也就是给头结点前面再加一个结点。
题目示例:203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)
struct ListNode* removeElements(struct ListNode* head, int val){
// 给结构体起一个别名 别名为ListNode,方便后面定义。
typedef struct ListNode ListNode;
// 创建一个结点(虚拟头结点)
ListNode *shead;
shead = (ListNode *)malloc(sizeof(ListNode));
// 让虚拟头结点的地址域指向头结点(把它放到头结点前面)
shead->next = head;
// 创建一个指向当前结点的指针,让这个指针指向虚拟头结点
// 之后就可以根据这个指向结点的指针进行遍历操作了。
ListNode *cur = shead;
// 删除操作
while(cur->next != NULL){
if (cur->next->