题目如下:
思路1:遍历链表遇到符合val的节点就进行删除
思路2:创建一个新链表,遍历旧链表,当节点的值不等于val时,尾插到新链表上
这里仅仅展示了思路二的实现:
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)
{
//定义新链表的头尾指针
ListNode* newHead = NULL;
ListNode* newTail = NULL;
//开始遍历旧链表
ListNode* pcur = head;
while (pcur) {
//不是val,尾插到新链表
if (pcur->val != val) {
//尾插分两种情况
//1链表为空,头节点和尾节点都为旧链表的头结点
if (newHead == NULL) {
newHead = newTail = pcur;
}
//2链表不为空
else {
newTail->next = pcur;
newTail = newTail->next;
}
}
//是val,跳过
pcur = pcur->next;
}
//返回值
//由于上面新链表的尾节点的next可能并不是NULL而是指向旧链表的下一个节点
//故这里做一步判断
if (newTail) {
newTail->next = NULL;
}
return newHead;
}