一、问题描述
二、解题思路
第一种方式 :删除原链表的指定元素
第二种方式 :创建新链表 尾插不属于指定元素的节点
这里只介绍第二种方式,因为更为简洁高效
- 首先创建新链表的首节点和尾节点指针 以及遍历原链表的pcur指针
- while循环,当pcur不为空时
判断该元素是否不等于要删除的元素
如果不是,进一步判断
若为空链表,首尾指针都指向新节点
若为非空链表,尾指针next指向该节点,尾指针向后移动
pcur向后移动- 出循环时,表明链表遍历完成 或未进入循环(原链表为空的情况)
如果尾指针不为空的话,将尾指针的next指向空(这种情况对应的是原链表尾节点是需 要删除元素的情况,这种情况需要手动置空)
而对尾指针判空是防止对空链表的尾指针解引用- 最后返回新链表首节点
三、源代码实现
struct ListNode { int val; struct ListNode* next; }; struct ListNode* removeElements(struct ListNode* head, int val) { struct ListNode* newhead, * newtail;//创建新链表的头指针尾指针 newhead = newtail = NULL;//初始化 struct 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;//pcur向后移动 } if (newtail)//先判空是为了保证不是空链表 { newtail->next = NULL;//将尾节点next指针指向NULL } return newhead; }