文章目录
- 题目
- 一、解题思路
- 完整代码
所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
题目

一、解题思路
  思路分析:这道题需要注意一个特殊情况,当删除的是头结点时,直接删除就找不到整个链表。因此我们加入一个假节点,代替头结点的作用,即使删除了也能找到整个链表,同时C++需要手动释放内存,使用delete删释放内存。
  程序如下:
  程序如下:
class Solution {
public:
	LinkNode* removeElements(LinkNode* head, int val) {
		LinkNode* FakeNode = new LinkNode(0, head);
		LinkNode* cur = FakeNode;
		while (cur != NULL && cur->next != NULL) {
			if (cur->next->val == val) {
				LinkNode* tmp = cur->next;
				cur->next = cur->next->next;
				delete tmp;
			}
			else {
				cur = cur->next;
			}
		}
		head = FakeNode->next;
		delete FakeNode;
		return head;
	}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
再写这份代码是还借鉴了两篇博文,当时想将数组传入函数,在函数内部使用sizeof计算数组长度,后面更改了思路,参考C/C++ 数组作为参数传递到函数后,使用 sizeof 产生的问题。在创建链表时,参考C++ 详解创建链表过程。
完整代码
# include <iostream>
using namespace std;
struct LinkNode {
	int val;
	LinkNode *next;
	LinkNode() : val(0), next(nullptr) {}
	LinkNode(int x) : val(x), next(nullptr) {}
	LinkNode(int x, LinkNode *next) : val(x), next(next) {}
};
 
class Solution {
public:
	LinkNode* removeElements(LinkNode* head, int val) {
		LinkNode* FakeNode = new LinkNode(0, head);
		LinkNode* cur = FakeNode;
		while (cur != NULL && cur->next != NULL) {
			if (cur->next->val == val) {
				LinkNode* tmp = cur->next;
				cur->next = cur->next->next;
				delete tmp;
			}
			else {
				cur = cur->next;
			}
		}
		head = FakeNode->next;
		delete FakeNode;
		return head;
	}
};
LinkNode* ChainGenerator(int arr[], int len) {
	LinkNode *head = new LinkNode(arr[0], NULL);
	
	LinkNode* p = head;
	for (int i = 1; i < len; i++) {
		LinkNode* pNewNode = new LinkNode(arr[i], NULL);
		p->next = pNewNode; // 上一个节点指向这个新建立的节点
		p = pNewNode; // p节点指向这个新的节点
	}
	return head;
}
void my_print(LinkNode* head, string str) {
	cout << str << endl;
	LinkNode *cur = head;
	while (cur != NULL) {
		cout<< cur->val <<' ';
		if (cur->next == NULL) break;
		cur = cur->next;		
	}
	cout << endl;
}
int main()
{
	int arr[] = { 1,2,6,3,4,5,6 };
	int len = sizeof(arr) / sizeof(int);
	int target = 6;
	Solution s1;
	LinkNode* head = ChainGenerator(arr, len);
	my_print(head, "目标链表:");
	head = s1.removeElements(head, target);
	my_print(head, "删除目标元素后的链表:");
	system("pause");
	return 0;
}
end



















