题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
这道题目目的考察的就是链表的节点中元素删除,链表室友一个个节点组成的,节点包含数据域与指针域,如下图所示
struct ListNode
{
int val;//数据域
ListNode*next;//指向下一个节点的指针
ListNode(int x):val(x),next(NULL){}//构造函数
};
这里就涉及如下链表操作的两种方式:
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
来看第一种操作:直接使用原来的链表来进行移除。
直接上代码:
class Solution
{
public:
struct ListNode
{
int val;//数据域
ListNode* next;//指向下一个节点的指针
ListNode(int x) :val(x), next(NULL) {}//
};
//删除头节点
ListNode* RemoveNode(ListNode* head, int val) {
while (head != NULL && head->val == val) {
ListNode* temp = head;//创建一个临时节点指向头节点
head->next = head;//令头结点的指针指向新的头结点
delete temp;//内存释放
}
//删除非头结点
ListNode* cur = head;//设置当前结点
while (cur != NULL && cur->next != NULL) {
if (cur->next->val== val) {//cur->next就是当前节点的指针,然后指向下一个节点
ListNode* tmp = cur->next;
cur->next = cur->next->next;//令当前节点的指针等于下一个节点的指针
delete tmp;
}
else
{
cur = cur->next;//不断更新当前节点
}
}
return head;
}
第二种 创建虚拟头结点,这样就不用删除头结点了,建议用这用方法
//创建虚拟节点
ListNode* RemoveElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0);//创建虚拟节点
dummyHead->next = head;//令这个虚拟头节点指针head
ListNode* cur = dummyHead;//创建当前节点
while (cur->next != NULL) {//如果当前节点指向的下一个节点不为空,一直循环
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else
{
cur = cur->next;
}
}
head = dummyHead->next;//最后令这个虚拟节点的指针指向头结点
delete dummyHead;//内存释放
return head;
}
由上述代码可以看到,创建虚拟节点的时间复杂度明显要高于第一种方法。
今天的分享就到这里,希望对各位小伙伴有帮助,给个赞鼓励一下吧!