题目链接:
题目描述
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == 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
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
题解
思路:这道题需要弄清楚链表的基本操作原理
代码(C++版本):
注意:有头节点时,首元节点与非首元节点的操作一致;无头节点时,首元节点与非首元节点的操作不一样。
//对于没有头节点的链表来说,对 首元节点 与 其他节点 的操作是不一样的
ListNode* removeElements(ListNode* head, int val) {
ListNode* p = head;//用于遍历head的所有节点
//首元节点
while (head != NULL && head->val == val) {
head = head->next;
delete p;
p = head;
}
//非首元节点
while (p != NULL && p->next != NULL) {
ListNode* dp = p->next;//用于寻找将被删除的节点
if (dp->val != val) {
p = p->next;
}
else if (dp->val == val) {
p->next = dp->next;
delete dp;
}
}
return head;
}
//对于有头节点的链表来说,对 首元节点 与 其他节点 的操作是一样的
ListNode* removeElements1(ListNode* head, int val) {
//首先添加一个头节点,使首元节点的操作同非首元节点的操作一致
ListNode* hp = new ListNode(0);//头节点
//将头节点插入到链表当中
hp->next = head;
head = hp;
ListNode *p = head;//用于遍历head的所有节点
while (p != NULL && p->next != NULL) {
ListNode* dp = p->next;//用于寻找将被删除的节点
if (dp->val != val) {
p = p->next;
}
else if (dp->val == val) {
p->next = dp->next;
delete dp;
}
}
//将头节点移除
head = hp->next;
delete hp;
return head;
}
分析:
-
时间复杂度:O(n),需要遍历链表一次。
-